2010-12-12 36 views
1

Je ne peux pas pourquoi le bit suivant du code C ne fonctionne pas:problème avec 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*); 
} 

L'idée est de trouver le nombre de caractères entre c1 et c2:

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

Malheureusement, cette impression est toujours 1. Quel est le problème? Est-ce que strchr ne devrait pas fonctionner comme string.IndexOf() de C#?

+0

Vous avez un compilateur très étrange :) 'toujours l'impression 1' ???? – pmg

Répondre

6

Division par sizeof(char*)? C'est incorrect - le résultat de la soustraction de deux pointeurs est une valeur numérique (ptrdiff_t) correspondant au nombre de valeurs, pas un pointeur ou une différence d'adresses.

Il y a aussi l'erreur «un par un» dans le calcul de la longueur. Alors que la dernière ligne devrait ressembler à:

return 1 + (endOcurrence - firstOcurrence); 
+0

Non seulement cela, mais chaque élément de la chaîne est 'sizeof (char)' octets, pas 'sizeof (char *)'. –

+0

Vrai, mais pas vraiment pertinent ici - le mécanisme arithmétique du pointeur fait abstraction de la taille des éléments pointés ici. – Kos

+0

Hmm Je pensais que soustraire un pointeur à un autre serait toujours un pointeur :( –

0

Non, strchr() renvoie un pointeur (l'adresse) le caractère recherché, ou NULL si le caractère n'a pas été trouvé.

C'est très différent de IndexOf().

+1

L'OP semble déjà le savoir, à en juger par le code – Kos

+0

Je ne voyais pas où il gère NULL En outre, il a spécifiquement posé des questions sur IndexOf(). –

1

Parce que chaque caractère occupe exactement sizeof (char) octets; pas sizeof (char*) octets.

Et sizeof (char) est, par définition 1, vous pouvez l'omettre:

return 1 + (endOcurrence - firstOcurrence); 

+1

En fait, même si 'sizeof (char)' n'était pas 1, la division serait erronée car la soustraction du pointeur produit un tableau. index ou nombre d'éléments, pas nombre d'octets entre les deux pointeurs – jpalecek

+0

@jpalecek: droite, réponse rayée :) – pmg

2

Votre déclaration de retour a plusieurs problèmes, en raison de ne pas comprendre l'arithmétique des pointeurs.

La soustraction du pointeur se divise déjà par la taille de l'élément, et char* était de toute façon le type incorrect.

Et vous devriez ajouterez 1, et non 2.