好吧,我一直在这里,我确切地知道故障的位置,但不知道如何解决它。我已经知道fgets和scanf对于这个程序会更好,但我做不到。
该程序大约10分钟前工作,然后我改变了它并得到了一个段错误。然后我把它改回去了,仍然有一个段错误。无论如何,我确信新鲜的眼睛会马上看到它。有它:D
PS:请注意我的(lessthan)而不是<因为我不知道如何正确地将这些留在我的代码示例中:(
#define WORDLENGTH 15
#define MAXLINE 1000
int main()
{
char *line[MAXLINE];
int i = 0;
int j;
int n;
char c;
for (n=0; c!=EOF; n++){
char *tmp = (char *) malloc(sizeof(char)*WORDLENGTH);
while ((c=getchar())!=' ')
tmp[i++]=c;
line[n]=tmp;
i=0;
printf("\n%s\n",line[n]); //
}
for(j = 0; j < n; j++){
printf("\n%s\n", line[j]);
free (line[j]);
}
return 0;
}
答案 0 :(得分:6)
line[n++] = tmp
。然后在此之后访问line[n]
。但是尚未分配line[n]
。
要更改它,您可以改为打印line[n-1]
,但更清楚的是:
line[n] = tmp;
i = 0;
printf(... line[n]);
并将增量放在for语句中,即for (n = 0; c != EOF; n++)
。
修改强>
这是我要做的总结:
将i=0
作业放在循环的开头。逻辑上,它是i
的初始化,目前它在两个地方完成(int i = 0;
和line[n]
分配后)。这两个地方都不在人们期望while
循环中使用的变量初始化的位置。
通过检查i
是否超过WORDLENGTH-1
来防止无意义输入。实际上,我可能会将内部while
循环编码为for
循环,我喜欢这样:
for (i = 0; i < WORDLENGTH; i++) {
tmp[i] = getchar();
if (tmp[i] == ' ') break;
}
tmp[i] = 0;
或(在我的角色中)for(i = 0; i < WORDLENGTH; ++i) if ((tmp[i] = getchar()) == ' ') break;
后跟..
tmp[i] = 0
到NUL终止字符串。由于malloc
不一定返回0填充的内存块。
答案 1 :(得分:1)
建议的解决方案中仍然存在错误!
所以这个分配不正确(超出范围)
tmp[i]= 0;
可以用
修复char *tmp = (char *) malloc( sizeof(char) * (WORDLENGTH + 1) );
if ( tmp == NULL ) // end of available memory
break;
此外,目前尚不清楚是否在最后一个字符串中允许EOF。