因为scanf不知道数组的长度。变量"name"不是类型"array"而是类型"pointer"(或者"address")。它说,从这里开始写,一直写到你完成为止。你可能会幸运地在栈上有其他不太重要的东西被覆盖,但最终,scanf会不断地写入和覆盖一些致命的东西,然后你会得到一个段错误。这就是为什么你必须始终传递数组的大小。
这就像给一个盲人一支铅笔,让他从这里开始写,却看不见纸张的结尾。他们最终会在桌子上写字并损坏某些东西。(注意:这不是针对盲人的攻击,这只是个比喻。)
在上述情况下,我强烈建议使用fgets()从stdin中获取特定数量的内容,然后使用sscanf()从该行中提取任何信息,并根据需要将其放入单独的变量中。Scanf()和fscanf()是邪恶的,我从未发现过它们能解决fgets()+sscanf()不能更安全地解决的问题。
char line[1024]; /* arbitrary size */
if( fgets( line, 1024, stdin ) != NULL )
{
fprintf( stdout, "Got line: %s", line );
}
或者对于超出字符串的内容:
# cat foo.c
#include <stdio.h>
int main( int argc, char **argv )
{
int i;
char line[1024];
while( fgets( line, 1024, stdin ) != NULL )
{
if( sscanf( line, "%d", &i ) == 1 )
{
fprintf( stdout, "you typed a number: %d\n", i );
}
}
}
# gcc foo.c -o foo
# ./foo
bar
2
you typed a number: 2
33
you typed a number: 33
<CTRL-D>