2010-12-12 2 views
1

Ich kann nicht, warum das folgende Bit von C-Code funktioniert nicht:Problem strchr

int obtainStringLength(char* str, char c1, char c2) { 
    char* firstOcurrence = strchr(str, c1); 
    char* endOcurrence = strchr(str, c2); 
    return 2+(endOcurrence - firstOcurrence)/sizeof(char*); 
} 

Die Idee, wie viele Zeichen zwischen c1 sind zu finden ist und c2:

printf("%d\n", obtainStringLength("abc def ghi", 'a', 'i')); //should yield 11 

Leider druckt das immer 1. Was ist das Problem? Sollte nicht strchr funktionieren wie C# string.IndexOf()?

+0

Sie haben einen sehr seltsamen Compiler :) 'immer Drucken 1' ???? – pmg

Antwort

6

Division von sizeof(char*)? Das ist falsch - das Ergebnis der Subtraktion zweier Zeiger ist ein numerischer Wert (ptrdiff_t), der der Anzahl der Werte entspricht, nicht ein Zeiger oder eine Differenz von Adressen.

Es gibt auch einen Fehler bei der Berechnung der Länge. So sollte die letzte Zeile wie folgt aussehen:

return 1 + (endOcurrence - firstOcurrence); 
+0

Nicht nur das, sondern jedes Element im String ist 'sizeof (char)' Bytes, nicht 'sizeof (char *)'. –

+0

Richtig, aber nicht wirklich relevant hier - der Zeiger-arithmetische Mechanismus abstrahiert hier die Größe von spitzen Elementen. – Kos

+0

Hmm ich dachte Subtrahieren eines Zeigers zu einem anderen wäre immer noch ein Zeiger :( –

0

Nein, strchr() einen Zeiger (die Adresse) gibt das Zeichen gesucht wird, oder NULL, wenn das Zeichen nicht gefunden wurde.

Das ist sehr verschieden von IndexOf().

+1

Das OP scheint das bereits zu kennen, nach dem Code zu urteilen – Kos

+0

Ich habe nicht gesehen, wo er NULL behandelt.Außerdem fragte er speziell nach IndexOf(). –

1

Da jedes Zeichen genau sizeof (char) Byte belegt; nicht sizeof (char*) Bytes.

Und sizeof (char) ist per Definition 1, so können Sie es weglassen:

return 1 + (endOcurrence - firstOcurrence); 

+1

Eigentlich, auch wenn 'sizeof (char)' nicht 1 wäre, würde die Division falsch sein.Das liegt daran, dass Zeiger Subtraktion Array ergibt Index oder Anzahl der Elemente, nicht Anzahl der Bytes zwischen den beiden Zeigern – jpalecek

+0

@jpalecek: richtig, Antwort zerkratzt :) – pmg

2

Ihre return-Anweisung mehrere Probleme hat, aufgrund nicht Pointer-Arithmetik zu verstehen.

Die Pointer-Subtraktion teilt sich bereits durch die Elementgröße, und char* war sowieso der falsche Typ.

Und Sie sollten hinzufügen, 1, nicht 2.