我有段故障,但我不知道为什么。 我知道它应该工作但是它告诉我有一个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;
}
答案 0 :(得分:1)
我建议你替换
if(c!=' ' && c!='\t' && c!='\n')
带
if(!isspace(c)) // Iam easier and more readable
来自ctype.h
。哪个检测到所有这些字符
' ' 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 **
我可以在你的字符串中看到空格,但你没有抓住它们,这可能会有所帮助
while ((c=s[id_s++]) && isspace(c))
;