0

La première condition if entraîne une erreur de segmentation. Je ne peux pas vraiment comprendre pourquoi, puisque j'utilise des clauses similaires si avec des opérateurs relationnels ailleurs. Merci d'avance pour votre aide.Erreur de segmentation à l'aide d'opérateurs relationnels dans if condition

int foo(char *str1,char **str2, char **str3) 
{ 
    char *token1; 
    char *token2; 
    char *token = strtok(str1, "\""); 
    int spaces = strcmp(token," "); 
    int parenthesis = strcmp("{",token); 
    if((token == NULL) || ((spaces != 0) && (parenthesis != 0))) 
    { 
    printf("ERR.\n"); 
    return 0; 
    } 
    token = strtok(NULL, "\""); 
    if(token == NULL) 
    { 
    printf("2ERR\n"); 
    return 0; 
    } 
    token1= strtok(NULL, "\""); 
    if(token1 == NULL || strcmp(token1," -> ") != 0) 
    { 
    printf("3ERR\n"); 
    return 0; 
    } 
    token2 = strtok(NULL, "\""); 
    return 1; 
    } 
+0

Où est déclaré parente dans cet extrait de code? – Arc676

+1

Où les noms 'name_a' et' parente' sont-ils définis? Qu'est-ce que vous passez en tant que 'str1' Si c'est un littéral de chaîne ou une autre mémoire const,' strtok() 'provoquera des problèmes quand il essayera d'écrire' \ '0'' dans la chaîne. – Gerhardh

+0

Etes-vous sûr que vous avez même atteint votre instruction 'if'? L'avez-vous exécuté dans le débogueur? – Gerhardh

Répondre

0

Le strtok se bloque si vous n'utilisez pas char[]. Vous pouvez le contourner en utilisant strcpy.

char str[80]; 
strcpy(str, str1); 
char *token = strtok(str, "\""); 

Je ne suis pas sûr de ce que vous essayez de faire, mais votre code s'exécutera sans se bloquer après le petit changement.

#include <stdio.h> 
#include <string.h> 
int foo(char *str1,char **str2, char **str3) 
{ 
    char *token1; 
    char *token2; 

    char str[80]; 
    strcpy(str, str1); 
    char *token = strtok(str, "\""); 
    int spaces = strcmp(token," "); 
    int parenthesis = strcmp("{",token); 
    if((token == NULL) || ((spaces != 0) && (parenthesis != 0))) 
    { 
     printf("ERR.\n"); 
     return 0; 
    } 
    token = strtok(NULL, "\""); 
    if(token == NULL) 
    { 
     printf("2ERR\n"); 
     return 0; 
    } 
    token1= strtok(NULL, "\""); 
    if(token1 == NULL || strcmp(token1," -> ") != 0) 
    { 
     printf("3ERR\n"); 
     return 0; 
    } 
    token2 = strtok(NULL, "\""); 
    return 1; 
} 
int main() { 

    char * c1, * c2, * c3; 
    c1 = "foobaz"; 
    c2 = "bar"; 
    c3 = "baz"; 

    int i = foo(c1, &c2, &c3); 
    return 0; 
} 
+0

L'instruction "Fonction' strtok' va planter si vous n'utilisez pas 'char []' "est généralement trompeur, et pas forcément correct. La fonction 'strtok' prend un pointeur vers un tableau de caractères à terminaison nulle ** non-constant **. Par exemple, si vous déclarez 'const char str [5]', vous obtiendrez une erreur de segmentation (ou plus généralement un comportement non défini) lors de l'appel de 'strtok (str, ...)'. Comme un littéral de chaîne est constant par définition, il ne peut pas non plus être passé comme premier argument d'entrée de la fonction 'strtok'. –

+0

Si un pointeur est passé à 'strtok' qui pointe vers la mémoire à partir d'une allocation dynamique, alors nous pouvons supposer que nous n'avons pas de problème avec la mémoire const. – Gerhardh