2017-08-16 2 views
-7

J'ai une erreur de segmentation mais je ne sais pas pourquoi. Je sais que ça devrait marcher, mais ça me dit qu'il y a un problème, quelqu'un a une solution? S'il vous plaît quelqu'un d'aide que j'ai besoin de savoir pour mon BA.Erreur de segmentation, je ne sais pas pourquoi

#include <stdio.h> 
#include <stdlib.h> 

int split_allocate(const char* s, char*** word_array){ 
    char c; 
    char tmp[100]; 
    int id_s,i=0, j=0,k; 
    for(id_s =0 ; (c=s[id_s])!='\0' ; id_s++){ 
     printf("%c\n", c); 
     if(c!=' ' && c!='\t' && c!='\n'){ 
      tmp[i]=c; 
      i++; 
      printf("i if : %d\n", i); 
      continue; 
     } 
     tmp[i]='\0'; 
     printf("i else : %d & tmp : %s\n", i, tmp); 
     (*word_array)[j] = (char*)malloc(sizeof(char)*(i+1)); 
     printf("666\n"); 
     if(NULL== (*word_array)[j]){ 
      return -1; 
     } 
     for(k=0 ; tmp[k] != '\0' ; k++){ 
      (*word_array)[j][k]=tmp[k]; 
     } 
     (*word_array)[j][k+1]='\0'; 
     j++; 
     printf("j for : %d\n", j); 
     i=0; 
    } 
    return j; 
} 

int main(void) { 
    char* s = "Salut, cet examen\n a l'air long..."; 
    char*** word_array; 
    printf("number of words :%d\n", split_allocate(s,word_array)); 
    return 0; 
} 
+4

'word_array' est un pointeur, mais * où indique-t-il? * –

+0

Comportement non défini pour l'utilisation de la valeur d'un objet avec une durée de stockage automatique pendant qu'il est indéterminé. – EOF

+3

En outre, être un [programmeur à trois départs] (http://wiki.c2.com/?ThreeStarProgrammer) n'est * pas * quelque chose à rechercher. –

Répondre

1

Je vous recommande de remplacer

if(c!=' ' && c!='\t' && c!='\n') 

avec

if(!isspace(c)) // Iam easier and more readable 

de ctype.h. Qui détecte tous ces personnages

' '  space 
'\t'  horizontal tab 
'\n'  newline 
'\v'  vertical tab 
'\f'  feed 
'\r'  carriage return 

Aussi, vous devriez changer char*** word_array; (général trois étoiles) à pointer to pointer ce qui est suffisant. Puis allouez de la mémoire sur heap (durée de stockage dynamique). Vous ne l'avez pas fait et il a causé segmentaion fault (déréférencer le pointeur non initialisé).

char ** word_array = malloc (sizeof(char *) * ROWS); 
for (int i = 0; i < ROWS; ++i) 
{ 
    word_array[i] = malloc (sizeof(char) * ROW_LEN); 
} 

Vous ne devriez pas jeter la valeur de retour de malloc() parce qu'elle peut conduire à problems.

Vous devez également vérifier le nombre de lignes et, si nécessaire, utiliser realloc pour obtenir plus de lignes, car l'accès en dehors des limites conduit à undefined behavior.


lieu de caractère de copie par caractère, utilisez strcpy, puisque vous savez qu'il ya assez d'espace. C'est plus lisible et plus facile.

for(k=0 ; tmp[k] != '\0' ; k++){ 
    (*word_array)[j][k]=tmp[k]; 
} 

à

strcpy(word_array[j], tmp); // In case word_array is char ** 

Je peux voir des espaces dans votre chaîne, mais vous ne en les skiping, cela peut aider

while ((c=s[id_s++]) && isspace(c)) 
    ;