Forum: Compiler & IDEs String zerlegen


von Der M. (naeschd)


Lesenswert?

Hallo zusammen,

ich weiß was jetzt kommt ist eine absolute Newbiefrage. Ich hab mich 
auch schon durch die Stringfunktionen gekämpft und gegoogelt aber 
irgendwie nichts gefunden was passt.

Folgendes:
Ich möchte folgenden String zerlegen, sodass zum Schluss nur noch die 
IP-Adresse in einem String gespeichert wird:
IP=192.168.2.32:2000
Ich möchte nachher haben: 192.168.2.32

Wie gesagt ich bekomms einfach nicht hin. Könnt ihr mir da helfen?

So... Und nun steinigt mich ;-)

Vielen Dank für eure Hilfe!
Matze

von cccccc (Gast)


Lesenswert?

In C?

Quick, dirty und mit heißer Nadel gestrickt. Keine Fehlerbehandlung.
1
uint8_t i;
2
char s[]="IP=192.168.2.32:2000";
3
4
for(i=0;s[i]!=':';i++);
5
s[i]='\0';
6
memmove(s,s+3,strlen(s)-3);

von cccccc (Gast)


Lesenswert?

Eventuell auch so:
1
uint8_t i;
2
char string[42]="IP=192.168.2.32:2000";
3
char *s=string;
4
5
for(i=0;s[i]!=':';i++);
6
s[i]='\0';
7
s+=3;

von Karl H. (kbuchegg)


Lesenswert?

Und wenn du den String nicht inplace verändern willst, und statt dessen 
lieber auf Standard-C Funktionen zurückgreifst, dann sind strchr bzw. 
strncpy deine Freunde.

Mittels strchr wird der '=' gesucht.
Mittels einem weiteren strchr wird der ':' gesucht.

Den Teil dazwischen holst du dann mit einem strncpy heraus und hängst 
noch ein 0 Byte als Abschluss an.

von Der M. (naeschd)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Und wenn du den String nicht inplace verändern willst, und statt dessen
> lieber auf Standard-C Funktionen zurückgreifst, dann sind strchr bzw.
> strncpy deine Freunde.
>
> Mittels strchr wird der '=' gesucht.
> Mittels einem weiteren strchr wird der ':' gesucht.
>
> Den Teil dazwischen holst du dann mit einem strncpy heraus und hängst
> noch ein 0 Byte als Abschluss an.

Danke schonmal für die Antworten. ccccccs Variante funktioniert auch 
gut.

@Karl Heinz: Genauso habe ich es auch vorgehabt. Aber bei mir scheitert 
es an der Ausgabe der Zeichenposition wo er das zu suchende Zeichen 
findet.
Ich vermute das liegt bei mir daran, dass ich bei Zeigern noch so meine 
Probleme habe. Wäre nett wenn du mir ein kurzes Beispiel geben könntest.
Vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

Der Matze schrieb:

> @Karl Heinz: Genauso habe ich es auch vorgehabt. Aber bei mir scheitert
> es an der Ausgabe der Zeichenposition wo er das zu suchende Zeichen
> findet.
> Ich vermute das liegt bei mir daran, dass ich bei Zeigern noch so meine
> Probleme habe.

Dann mal dir die Situation auf!

> Wäre nett wenn du mir ein kurzes Beispiel geben könntest.
> Vielen Dank!
1
#include <stdio.h>
2
#include <string.h>
3
4
int main(int argc, char* argv[])
5
{
6
  char InputString[] = "IP=192.168.2.32:2000";
7
8
  char Result[20];
9
  char* start = strchr( InputString, '=' );
10
  char* end   = strchr( InputString, ':' );
11
  size_t len;
12
13
  start = strchr( InputString, '=' );
14
  end   = strchr( InputString, ':' );
15
16
  if( start && end ) {
17
    start++;
18
    len = end - start;
19
    strncpy( Result, start, len );
20
    Result[len] = '\0';
21
22
    printf( "%s", Result );
23
  }
24
  return 0;
25
}


Ist zwar eine schöne Lösung aber auch sehr ineffizient.
Effizienter wird es, wenn man das alles ganz einfach mit der Hand macht

In einer Schleife durch, bis man den Anfang gefunden hat, ab dort dann 
Zeichen kopieren, bis das Ende gefunden wurde.
1
int main(int argc, char* argv[])
2
{
3
4
  char InputString[] = "IP=192.168.2.32:2000";
5
  char Result[20];
6
7
  char* source = InputString;
8
  char* dest   = Result;
9
10
  while( *source && *source != '=' )     // Anfang suchen
11
    source++;
12
13
  if( *source == '=' ) {                 // Anfang gefunden ?
14
    source++;                            // den = überspringen
15
16
    while( *source && *source != ':' )   // und umkopieren, bis das Ende gefunden
17
      *dest++ = *source++;
18
  }
19
  *dest = '\0';                          // noch ein \0 dran und fertig
20
    
21
  printf( "%s", Result );
22
23
24
  return 0;
25
}

von Der M. (naeschd)


Lesenswert?

Vielen Dank! Ich verstehe von der Funktion her beide Lösungen...
Aber warum wird in der Lösung 2 der *source-Zeiger mit sich selbst 
verglichen?
1
while( *source && *source != '=' )     // Anfang suchen
2
    source++;
Warum reicht es nicht wenn man das so macht?
1
while( *source != '=' )     // Anfang suchen
2
    source++;

Danke für deine geduldige Hilfe :-)
Matze

von Karl H. (kbuchegg)


Lesenswert?

Der Matze schrieb:
> Vielen Dank! Ich verstehe von der Funktion her beide Lösungen...
> Aber warum wird in der Lösung 2 der *source-Zeiger mit sich selbst
> verglichen?

wird er doch gar nicht.

an dieser Stelle ist *source die kürzere Schreibweise für

    *source != 0  ....

was in diesen Zusammenhang, da source ein Pointer auf char ist, 
identisch ist zu

    *source != '\0' ....


*source ist einfach nur ein Ausdruck. source ist der Pointer auf ein 
Zeichen, also ist *source das Zeichen selber. Und in C gilt: alles 
ungleich 0 gilt als logisch wahr. Nur 0 ergibt logisch falsch. *source 
prüft also ab, ob das Zeichen, auf das source zeigt, ungleich 0 ist. qed

> Warum reicht es nicht wenn man das so macht?
>
1
> while( *source != '=' )     // Anfang suchen
2
>     source++;
3
>

und jetzt überleg mal, was wohl passiert, wenn ich deinem Code diesen 
String

      "abcdefghijkl"

(also einen ohne '=') vorwerfe.


Code muss auch im Fehlerfall soweit korrekt funktionieren, dass nix 
Schlimmes passiert.

von ZiZi (Gast)


Lesenswert?

strtok()

von cccccc (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Code muss auch im Fehlerfall soweit korrekt funktionieren, dass nix
> Schlimmes passiert.

Deswegen ist mein Gebastel da oben auch nicht für den "produktiven 
Einsatz" geeignet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.