2012-04-13 1 views
1

J'ai déjà regardé d'autres questions etc et j'ai vu que vous ne pouvez pas avoir un premier arg dans strtok qui ne peut pas être édité mais je ne pense pas que j'ai dans ce code mais toujours obtenir une faute de seg? Est-ce que j'utilise strtok mal?strtok() erreur seg

Ce code doit prendre stdin au format CSV délimité par des virgules et ajouter les chiffres du stdin puis les imprimer sur stdout, p.s. Je l'ai eu travailler quand jeton n'était pas un pointeur, par exemple. i+= token; mais je recevais une sortie aléatoire comme on pouvait s'y attendre je suppose.

#include <stdio.h> 
#include <string.h> 
int main(){ 
char *token, input[256]; 
int i = 0; 

scanf("%s" , input); 
token = strtok (input, ","); 

while(token != NULL){ 
    token = strtok(NULL, ","); 
    i += *token; 

     }     

printf("%d\n", i); 
return 0; 
    } 

Merci Lachlan

Répondre

7

À un certain moment strtok retournera NULL que vous ne vérifie pas:

token = strtok(NULL, ","); 
i += *token; /* Will dereference NULL. */ 

Au lieu de cela, vous devez faire:

while(token != NULL){ 
    i += *token; /* We know `token` isn't NULL. */ 
    token = strtok(NULL, ","); 
} 

Comme un côté notez ce que vous faites - en ajoutant des valeurs de caractères - n'a pas beaucoup de sens. Vous aurez envie de les convertir en quelque sorte, en utilisant probablement strto(u)l.

+0

Doh! Merci désolé à ce sujet. – UNECS

+0

pardon mon ignorance je ne l'ai pas trouvé dans mes recherches does 'strtol (token)' changez le jeton en 'NULL'? – UNECS

+0

@LachlanMcGivern 'strtol' ne change pas son premier argument. – cnicutar

0

Vous devez convertir la chaîne en nombre entier avant de faire i+=*token, jetez un oeil à la fonction telle que strtol qui convertit une chaîne en nombre entier.