2017-08-16 90 views
-7

我有一个seg故障,但我不知道为什么。 我知道它应该工作,但它可以告诉我有一个seg故障有人有解决方案吗? 请有人帮助我需要知道我的学士学位。分段错误,我不知道为什么

#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'是一个指针,但其中*它指向了什么?* –

+0

在未确定的情况下使用具有自动存储持续时间的对象的值的未定义行为。 – EOF

+3

此外,作为[三开始程序员](http://wiki.c2.com/?ThreeStarProgrammer)是*不是*的东西要争取。 –

回答

1

我会建议你用

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

ctype.h更换

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

。检测所有这些字符

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

你也应该改变char*** word_array;(三星一般),以pointer to pointer这就足够了。然后分配内存heap动态存储时间)。你没有做到这一点,并导致segmentaion fault(取消引用未初始化的指针)。

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

你不应该投malloc()的返回值,因为它可能会导致problems

此外,您应该检查行数,并且如果需要使用realloc以获取更多行,因为访问超出范围会导致undefined behavior


而不是逐个字符复制使用strcpy,因为你知道有足够的空间。它更可读和更容易。

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

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

我可以看到你的字符串中的空格,但你的arent skiping他们来说,这可能有助于

while ((c=s[id_s++]) && isspace(c)) 
    ; 
相关问题