下面是一个询问用户的程序
输入一个名字,然后打印出名字的一个字母
一次,最终生成整个名称。
我有两个版本的程序。下面那个
做了一件奇怪的事:如果我输入类似
jkljljkliunionnklsaa
,它只会产生jkljljkl
。
但是如果我限制 char name[40]
,然后输入相同的 name,程序会显示完整的名称。
我在不允许它生成全名的程序中做错了什么?
#include <stdio.h>
#include <string.h>
int main (void)
{
int i, s;
char name[s];
printf ("Type a name: ");
scanf ("%s", name);
for ( i = 0; i < strlen(name); i++)
{
printf ("%c", name[i]); // print the i-th character of name
}
printf("\n");
}
最佳答案
int i, s;
char name[s];
这是未定义的行为(在 ISO C 术语中;任何事情 都可能发生,甚至是您可能预料到的事情),因为 s
未初始化.与您的问题的措辞不同,作为数组大小的未初始化变量不意味着不受限制的大小。这意味着程序错误。 :-)
s
可能恰好是 0 或 10 或 -136186732,因此您可能有也可能没有足够大的字符数组来存储一些字符。
它将再次开始工作
int i, s = 40;
澄清一下,C 不有自动增长或自适应数组。如果您需要在运行时分配数组或调整数组大小,则需要使用 malloc()
和 realloc()
。
关于带有 scanf : nonrestricted char array doesn't give correct result 的字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32229471/