【发布时间】:2019-11-01 01:40:33
【问题描述】:
我尝试创建一个可扩展的最多 20 个字母的单词列表。在添加到列表之前,我使用 'char word[20]' 作为每个新单词的主机。对于长度为 20- 的单词的输入,该程序运行良好。如果我添加一个长度为 20+ 的单词,我的程序应该忽略并继续。
但是在下一次,我在那些 if-else 语句的 strlen(word) 的某个地方得到了 Segmentation Fault。
奇怪的是有时我的程序可以克服这个故障,但在大多数情况下,它会崩溃。
一些尝试: - 如果我使用 'char word[1000]' ,它在任何时候都可以正常工作(到目前为止)。我猜到 strlen() 的参数指针在“继续”之后错误指向某个错误,所以我用 &word[0] 跟踪它并写了 strlen(&word[0]) 并使用 'char word[20]'。这并不能解决问题,并且在发生 Segmentation Fault 时 &word[0] 保持不变。
char *wordList[] = {""};
char word[10];
char * p, c;
int i = -1;
int size = 10;
int strlength = -1;
while(strlength != 0){
//get word by using loop of getchar() and detect \0
printf("Enter word :");
scanf("%s",word);
printf("Taken word: %s at %p\n",word,&word[0]);
//detect word length to avoid 4-letter words and words with length 20+
if (strlen(word) == 0){
printf("Break due to length 0\n");
break;
}else if(strlen(word) > 20){
printf("Ignore due to length 20+\n");
continue;
}
printf("End checking length");
//add word to wordList by extending memory for one new word and assign each char to memory
i++;
wordList[i] = malloc(sizeof(char)*strlen(word)-1);
strcpy(wordList[i],word);
printf("[");
for(int j = 0; j <= i; j++){
printf(" %s,",wordList[j]);
}
printf("]\n");
【问题讨论】:
-
word中第一个字符
&word[0]的地址就是word -
wordList只有一个元素。wordList[i]具有未定义的行为,只要i > 0 -
@AviBerger 今晚你和我的想法很相似。 :)
-
您应该使用
%9s来确保scanf()的接收量不会超过word的容量。 -
@DanielFarrell 只是尝试一下。哈哈 。看起来很奇怪吧?大声笑
标签: c segmentation-fault strlen