我有以下程序
#include <stdio.h>
main()
{
char ch[10];
gets(ch);
printf("\nTyped: %s\n\n", ch);
int i = 0;
while ( ch[i] != '\0' )
{
printf("Letter: %c\n", ch[i]);
i++;
}
printf("\nTyped: %s\n\n", ch);
}
Run Code Online (Sandbox Code Playgroud)
这是输入"Hello world is good"时的输出
hello world is good
Typed: hello world is good
Letter: h
Letter: e
Letter: l
Letter: l
Letter: o
Letter:
Letter: w
Letter: o
Letter: r
Letter: l
Letter:
Typed: hello worl?
Run Code Online (Sandbox Code Playgroud)
为什么我在while循环后为同一命令获得两个不同的输出?虽然循环与它有任何关系..请帮助..
你知道"Hello world is good"超过10个字节吗?在这种情况下的行为是未定义的.任何事情都可能发生,任何事情,从您想要的系统崩溃到重新格式化硬盘驱动器和在ROM上烧垃圾.
你必须分配足够的空间gets
来放入字符串,在这种情况下你不需要.这是gets
应该避免使用的主要原因,fgets
而是使用.
您的角色阵列ch
只有10个字符的空间.你键入了超过10个字符的东西,并尝试将它存储在该数组中,有效地将数组的末尾写入不为任何东西保留的空间(或者至少不为你的字符保留).你在这种情况下很幸运,并没有写任何重要的东西(你的程序没有崩溃),但随后的代码出现(printf()
你的int i
等等)并更改了内存(毕竟它是堆栈,所以它在FIFO顺序中使用).
更改你的char ch[10]
to char ch[2048]
给你自己一个更大的缓冲区输入.您也可以使用,fgets()
而不是gets()
将输入的大小限制为缓冲区大小.如果您使用gets()
,请注意手册页上的警告:
调用者有责任确保输入线(如果有的话)足够短以适应字符串.