mikrocontroller.net

Forum: Compiler & IDEs Wie ermittle ich die Position eines Zeichens?


Autor: Ruby (Gast)
Datum:

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

Autor: tino (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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, ';');

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.
char str[]="Hallo;Leute";
char* pstr;
int index;

pstr = strchr(str, ';');

index = str - pstr;


Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Ruby (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char str[]="Hallo;Leute";
char* pstr;
int index;
pstr = strchr(str, ';');
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?

Autor: Ruby (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
if (pstr)
  index = pstr - str;
else
  index = -1;  // nicht gefunden!

(und überprüfe den Rückgabewert von strchr, wie angegeben)

Autor: Ruby (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

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.