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
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); |
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; |
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.
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!
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 | }
|
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.