2016-03-23 2 views
0

je l'extrait de code suivant:strtok ne retourne pas tous les jetons

char *buffer2 = malloc(1024*sizeof(char)); 
    scanf("%s",buffer2); 
    char *command = strtok(buffer2," "); 

    if (strcmp(command,"INFO") == 0) 
    { 
     char *file_path = strtok(NULL," "); 
     if (file_path != NULL) 
     { 
      info(file_path); 
     } 
    } 

Mon but est: d'une chaîne comme « nom_cmd PARAM1 PARAM2 » ... à la chaîne tokenize selon ce format. Jusqu'ici tout va bien, j'ai écrit le code ci-dessus, il compile, le programme ne plante pas, mais le résultat est, cependant, faux dans le sens où si je saisis la chaîne "INFO work/file1.sf" la commande est analysée correctement mais pour le file_path la fonction strtok retourne un pointeur NULL. J'ai lutté avec cela pendant des heures, j'ai lu la documentation pour cette fonction, j'ai cherché d'autres réponses sur ce sujet, mais aucun d'eux n'était satisfaisant. Si vous avez une idée de ce que je fais mal, aidez-moi s'il vous plaît.

+0

@ user3121023 Je pense que cela vaut une réponse –

+0

@ user3121023 Oh mon Dieu, tu as raison ... Je ne comptabilité un fait trivial. Merci beaucoup – Dragos2795

+0

Utilisez 'fgets' et ajoutez' \ n' aux séparateurs 'strtok'. –

Répondre

0

Vu le code suivant:

char *buffer2 = malloc(1024*sizeof(char)); 
scanf("%s",buffer2); 
char *command = strtok(buffer2," "); 

if (strcmp(command,"INFO") == 0) 
{ 
    char *file_path = strtok(NULL," "); 
    if (file_path != NULL) 
    { 
     info(file_path); 
    } 
} 

l'expression « sizeof (char) » est défini par la norme comme 1. Multipliant quoi que ce soit par 1 ne changera pas sa valeur et n'a pas d'effet sur la paramètre passé à malloc(). Toutefois, il encombre le code, rendant la compréhension, le débogage et la maintenance plus difficiles.

Suggérer de supprimer cette expression.

lorsque vous appelez scanf()

  1. toujours vérifier la valeur retournée pour assurer l'opération a réussi.
  2. lorsque vous utilisez le spécificateur de format « % s » .. doit utiliser un modificateur de caractères d'entrée max, l'utilisateur ne peut pas dépasser l'entrée buffer2
  3. le spécificateur de format « % s » arrête l'entrée lors de la rencontre tout « espace blanc ' L'appel à strtok() ne trouvera rien d'autre que la ligne d'entrée entière. car l'entrée s'est arrêtée avant d'entrer des espaces car un space est l'un des caractères «espace blanc».

Proposer le code suivant:

#define BUFFER_LEN (1024) 
char *buffer2 = NULL; 
if(NULL == (buffer2 = malloc(BUFFER_LEN))) 
{ // then malloc failed 
    perror("malloc for 1024 bytes failed") 
    exit(EXIT_FAILURE); 
} 

// implied else, malloc successful 

if(!fgets(buffer2, BUFFER_LEN, stdin)) 
{// then, fgets failed 
    perror("fgets from stdin failed"); 
    exit(EXIT_FAILURE)'' 
} 

// implied else, fgets successful 

char *command = NULL; 

if(NULL != (command = strtok(buffer2," \n"))) 
{ 
    if (strcmp(command,"INFO") == 0) 
    { 
     char *file_path = NULL; 
     if(NULL != (file_path = strtok(NULL," \n"))) 
     { 
      info(file_path); 
     } 
    } 
}