2010-09-05 12 views
2

Je reçois l'erreur assignment makes pointer from integer without a cast sur le code suivant, qu'est-ce que cela signifie?C++: avertissement d'affectation de pointeur sur strchr()

char * splitter; 
if(splitter = strchr(key, ':') != NULL && *(splitter + 1) == ' ') 
+0

Relié (non dupliqué) http://stackoverflow.com/questions/3626905/why-does-this-c-program-print-weird-characters-in-output/3626912#3626912 – codaddict

+0

Par souci de lisibilité vous devrait déplacer l'affectation hors de l'instruction if. Aussi '* (splitter + 1)' est équivalent à 'splitter [1]'. – sellibitze

Répondre

1

L'opérateur != a une priorité plus élevée que l'opérateur =. Cela signifie que votre expression splitter = strchr(key, ':') != NULL est réellement interprétée comme splitter = (strchr(key, ':') != NULL).

Mettez l'affectation en parenthèses pour augmenter la priorité de cette partie:

(splitter = strchr(key, ':')) != NULL 
2

L'opérateur sans égal = a une priorité plus élevée que l'opérateur d'affectation =, de sorte que votre ligne originale se lit comme splitter = (strchr(key, ':') != NULL) plutôt que votre (splitter = strchr(key, ':)) != NULL prévu, de sorte que le compilateur essaie d'attribuer au séparateur le résultat de la comparaison entre strchr() et NULL.

1

Le != a une plus haute précision que le =. Vous devez entièrement mettre entre parenthèses:

if (((splitter = strchr(key, ':')) != NULL) && (*(splitter + 1) == ' ')) 
3

C'est à cause de la priorité des opérations. Vous avez besoin de mettre un jeu supplémentaire de parens pour vous assurer qu'il se passe dans l'ordre:

char * splitter; 
if((splitter = strchr(key, ':')) != NULL && *(splitter + 1) == ' ') 

sinon il évaluera comme ceci:

splitter = (strchr(key, ':') != NULL) 

Depuis strchr(key, ':') != NULL sera évaluée à un 1 ou 0, dans votre exemple, vous affectez un entier à un type de pointeur, d'où l'avertissement.

Cependant, je voudrais juste l'écrire comme dans votre deuxième exemple, car il est plus simple et moins sujette aux erreurs. Le raccourcir d'une ligne n'ajoute rien sauf la complexité.

+0

J'écrirais 'splitter [1]' au lieu de '* (splitter + 1)', aussi. –