所以我写了这个函数:
int getword(char *fmt, int delim, int max, FILE *f)
{
int c, x = 0;
while (((c = getc(f)) != EOF) && (c != delim) && (x < max))
fmt[x++] = c;
return x;
}
每当我检查该功能时,最后总会有一个@
。
buf = color 32@
/* segmentation fault */
无论我做了什么改变它,变量总是以@
结束。我通过初始化变量来解决问题:
char buf[100] = {0};
但是,自从我一直想知道如果未初始化的@
可以是其范围内的任何内容,该字符始终为char
。为什么默认为@
?
答案 0 :(得分:1)
原始代码缺少清除buf[]
,甚至char buf[100] = {0};
也不能确保在读取100个字符时终止空字符。否则printf("buf is %s\n",buf);
会尝试打印可能无效的字符串。
此外,在后续调用中char buf[100] = {0};
不会将数组重新归零。
最好使用getword(buf,'>',sizeof buf - 1,f);
并getword()
追加'\0'
。
为什么它会默认为@
这是未定义的行为。在您的情况下,buf[]
可能包含'@'
,但可能发生了任何事情。它没有默认到'@'
。
答案 1 :(得分:1)
你需要零终止你的字符串
int getword(char *fmt, int delim, int max, FILE *f)
{
int c, x = 0;
while (((c = getc(f)) != EOF) && (c != delim) && (x < max))
fmt[x++] = c;
fmt[x] = 0;
return x;
}
你得到了一个&#39; @&#39;因为那就是内存中剩下的东西,几乎可以肯定是shell或者加载器。而且每次你获得相同的随机垃圾时,shell或loader都是一样的。如果你稍微摇晃你的程序(在buff之前添加一些额外的变量),你会得到一个不同的垃圾。
答案 2 :(得分:0)
从未初始化的局部变量读取会调用未定义的行为。该计划可以随心所欲地做任何事情。