Hallo Ich bin WinAVR-Anfänger. Wie kann ich die Position eines Zeichens in einer Zeichenkette ermitteln? int intPos; char TextA ="Hallo;Leute"; intPos =strcmp(TextA , ";"); So geht es nicht wie ich herausgefunden habe. Ich glaube damit müsste es gehen aber wie ? char *strchr(const char *s, int c) Gruss Ruby
Das sollte gehn uint8_t getPos(const char *s){ register char c; uint8_t pos; while ( (c = *s++) ) { if(c == ';') pos = s; } return pos; } Tino
> intPos =strcmp(TextA , ";"); > > So geht es nicht wie ich herausgefunden habe. Logisch. Das vergleicht die beiden Strings und sagt dir, welcher lexikalisch vor dem anderen kommt. > Ich glaube damit müsste es gehen aber wie ? > char *strchr(const char *s, int c) Ist doch eigentlich relativ klar: char* p = strchr(TextA, ';');
@Rolf: Damit bekommst du aber nicht die Position des Zeichens (index), sondern einen Pointer auf das Zeichen. Aber es sollte funktionieren, den retournierten Pointer von der Adresse des ersten Elementes des Ursprungsstrings zu subtrahieren. So müsstest du an den Index des Zeichens kommen.
1 | char str[]="Hallo;Leute"; |
2 | char* pstr; |
3 | int index; |
4 | |
5 | pstr = strchr(str, ';'); |
6 | |
7 | index = str - pstr; |
> @Rolf: Damit bekommst du aber nicht die Position des Zeichens (index), > sondern einen Pointer auf das Zeichen. Der Zeiger gibt auch eine Position an, aber eben die im Speicher und nicht die innerhalb des Arrays. > Aber es sollte funktionieren, den retournierten Pointer von der Adresse > des ersten Elementes des Ursprungsstrings zu subtrahieren. Ja. Allerdings sollte man vorher pstr auf einen Nullzeiger testen. Der kommt nämlich zurück, wenn das Zeichen im String gar nicht gefunden wurde.
Hallo zusammen Erst mal Dank für die Hilfe. Dies gefällt mir am besten obwohl ich noch gewaltig Problem habe die Pointer wirklich zu verstehen. Doch leider bekomme ich nicht die Position wie ich möchte. Im Moment weiss ich gar nicht was er ausspukt aber nicht die Position. char str[]="Hallo;Leute"; char* pstr; int index; pstr = strchr(str, ';'); index = str - pstr; In diesem Fall wäre das Semikolon an 6. Stelle. Fängt man bei Null an wäre es die 5. Stelle. Leider triff beides nicht zu.
1 | char str[]="Hallo;Leute"; |
2 | char* pstr; |
3 | int index; |
4 | pstr = strchr(str, ';'); |
5 | index = str - pstr; |
Das Problem liegt in der letzten Zeile, das ergibt nämlich negative Werte. Angenommen, die Adresse, an der str beginnt, wäre 10. Dann ist die Adresse, an der das Semikolon zu finden ist, 15 ... Der gewünschte Indexwert ist 5. Klar?
Hallo Nein ist mir nicht klar. Also die Zeichenkette fängt bei Null an und somit ist das Semikolon an der 5 Stelle. Aber warum kriege ich einen Negativen Wert? Weil es der Index ein normaler "Int" ist? Oder was muss ich dageben tun damit ich den Absolutwert kriege?
Du bekommst einen negativen Wert, weil Du 15 (die Adresse des Semikolons) von 10 (der Anfangsadresse Deines Strings) abziehst. Das ist auch der Fall, wenn Du den Index des Semikolons (5) vom Index des ersten Zeichen Deines Strings (0) abziehst. Ersetze in Deinem Code die letzte Zeile durch
1 | if (pstr) |
2 | index = pstr - str; |
3 | else
|
4 | index = -1; // nicht gefunden! |
(und überprüfe den Rückgabewert von strchr, wie angegeben)
Danke es hat geklappt. Denoch bleibt eine Frage. Ist die Anfangsandresse demfalls bei einer Zeichenkette immer 10 oder hat es mit der Textlänge zu tun oder habe ich dies total falsch verstanden?
Die Anfangsadresse einer Zeichenkette ist die Speicheradresse, an der die im Speicher liegt. Welcher Wert sich dahinter verbirgt, ist mehr oder weniger rein zufällig; den Wert 10 habe ich nur zu Demonstrationszwecken verwendet. (und weil ich keine Lust hatte, den 32-Bit-Wert 0xdeadface zu verwenden, obwohl der fast so schön wäre wie 0xfeedc0de ... auch das sind rein willkürliche Zahlenwerte)
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.