mikrocontroller.net

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


Autor: AVRli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
void format(char *data) {
  uint8_t p;
  p = memchr(data, ';', BUF_SIZE) - data;
}

Wie würde man das nun anstellen?

Gruß AVRli...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Torsten K. (ago)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AVRli (Gast)
Datum:

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

Gruß AVRli...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.