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é.
Relié (non dupliqué) http://stackoverflow.com/questions/3626905/why-does-this-c-program-print-weird-characters-in-output/3626912#3626912 – codaddict
Par souci de lisibilité vous devrait déplacer l'affectation hors de l'instruction if. Aussi '* (splitter + 1)' est équivalent à 'splitter [1]'. – sellibitze