Forum: Compiler & IDEs Position eines Zeichens in einer Zeichenkette?


von AVRli (Gast)


Lesenswert?

Hi!

Ich dachte ich bekomme es allein hin aber allem Anschein nach habe ich 
ein Verständnissproblem mit den Funktionen.

Ich möchte ganz gerne wissen an welcher Position in einem Zeichenarray 
ein bestimmtes Zeichen ist.

Da die Funktion einen Zeiger auf das gefundene Zeichen zurück gibt nam 
ich nun an das ich den Start Zeiger einfach abziehen kann. Das klappt 
irgendwie nicht. :(

Dazu wollte ich die Funktion memchr verwenden.
1
void format(char *data) {
2
  uint8_t p;
3
  p = memchr(data, ';', BUF_SIZE) - data;
4
}

Wie würde man das nun anstellen?

Gruß AVRli...

von Karl H. (kbuchegg)


Lesenswert?

Kannst du 'klappt irgendwie nicht' genauer spezifizieren?

Grundsätzlich ist deine Überlegung gar nicht mal so schlecht.

Nur solltest du dir eines angewöhnen:
Es gibt in C 2 prominente Familien von Funktionen:
Da sind zum einen die mem.... Funktionen und zum anderen die str... 
Funktionen.
Beide haben unterschiedliche Aufgaben. Die einen, die str... Funktionen 
kommen immer dann zum Einsatz, wenn man es mit Strings (alswo Texten) zu 
tun hat. Strings sind in C speziell, weil es sich dabei um eine 
Sonderform von Bytefolgen handelt, bei denen das Byte mit dem Wert 0 
eine Spezialfunktionen inne hat. Es sagt uns, wo genau ein String zu 
Ende ist. Wenn ich den Text "Hallo" in einem Array der Länge 50 
speichere, dann ist die Speicherfläche zwar 50 Zeichen groß, der String 
hat aber nur eine Länge von 5 Zeichen. Alles was dahinter noch im 
Speicher steht, kann nicht sinnvoll für irgendwelche Ausertungen benutzt 
werden, weil es zufällig ist, was da genau drinnen steht. Die str... 
Funktionen wissen um die Sonderstellung dieses 0-Bytes und 
berücksichtigen es. Sie arbeiten immer nur soweit durch einen String 
durch, bis sie auf das 0-Byte stossen und hören dann auf.
Die mem.... Funktionen hingegen wissen darüber überhaupt nichts. Für die 
ist ein Byte-Feld einfach nur ein Byte-Feld. Diese Funktionen arbeiten 
immer das komplette angegebene Speicherfeld durch ungeachtet dessen, was 
da genau drinnen steht.

Wenn du dir über die Unterschiede zwischen mem... und str... im klaren 
bist und immer die richtige Funktion aus der richtigen Familie benutzt, 
je nachdem ob du es mit Strings zu tun hast oder nicht, dann hast du 
viel weniger Probleme. Deine Aufgabenstellung hört sich stark nach 
Texten an, also Stringverarbeitung. Daher ist eine Funktion aus dem 
mem... Bereich einfach nicht angebracht.

von Torsten K. (ago)


Lesenswert?

Rückgabewert testen, erst dann die Differenz bilden (wenn es gefunden 
wurde).
"uint8_t p" wird dann natürlich auch nicht ausreichen ;-)

Wie Karl-Heinz es schon gesagt hatte, nimm strchr:

char *strchr(const char *s, int c);

char * p;
int pos;

p=strchr(data, ';');
pos = (p) ? p-data : -1;

ist pos nun kleiner 0 dann gibts das Zeichen nicht, ansonsten ist pos 
der index ab data

von AVRli (Gast)


Lesenswert?

Jo vielen Dank für Eure Antworten ich habe es nun lösen können, sehr 
schön!

Gruß AVRli...

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.