Wie ermittle ich die Position eines Zeichens?

Gast #509266
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
Gast #509281
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, ';');
Persönliche Seite #509564
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.
1
char str[]="Hallo;Leute";
2
char* pstr;
3
int index;
4

5
pstr = strchr(str, ';');
6

7
index = str - pstr;

Gast #509611
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.
Gast #509729
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.
Gast #509831
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?
Persönliche Seite #509835
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
1
if (pstr)
2
  index = pstr - str;
3
else
4
  index = -1;  // nicht gefunden!

(und überprüfe den Rückgabewert von strchr, wie angegeben)
Gast #509918
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?
Persönliche Seite #509923
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren