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


von Ruby (Gast)


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

von tino (Gast)


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

von Rolf Magnus (Gast)


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, ';');

von Simon K. (simon) Benutzerseite


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;


von Rolf Magnus (Gast)


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.

von Ruby (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Ruby (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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)

von Ruby (Gast)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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)

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.