问题的全部功能是关于给出一个用{0}初始化的二维数组作为输出,并使用户能够在场上移动1
char wasd;
scanf("%c", &wasd);
(通过改变变量wasd的值来移动的函数我觉得并不重要) 现在我的问题是使用
的原因scanf("%s", &wasd);
只能部分工作(有时1会保持在某个字段,并且第二次出现在新地方,但实际应该删除) 和
scanf("%.1s", &wasd);
导致在不停止打印字段,直到关闭执行程序。在研究了%c和%s之间的区别Why does C's printf format string have both %c and %s?之后,我想出了使用%.1s?如果一个可以通过阅读它来找出答案,那么我并不聪明或远远不及c学习它。 我也发现了这个fscanf() in C - difference between %s and %c,但我对EOF一无所知,一个答案说的是问题的原因所以我宁愿在没有它的情况下得到答案。 谢谢你的回答
答案 0 :(得分:2)
简单,%s
是(非空)字符串的转换。 C中的字符串始终以0
字节结尾,因此任何非空字符串至少需要两个字节。如果您将指针传递给单个char
变量,scanf()
将覆盖该变量后的内存中的任何内容 - 您导致未定义的行为,并且可能发生任何事情。
旁注scanf("%s", ..)
,即使你给它char
的数组,如果输入的时间更长,也总会溢出缓冲区,因此导致未定义行为即可。你必须包括像
char str[10];
scanf("%9s", str);
最好不要使用scanf()
。对于单个字符输入,您可以使用getchar()
(请注意它返回int
)。您可能还想阅读我的beginners' guide away from scanf。
答案 1 :(得分:2)
char
变量只能容纳一个字节的内存来容纳一个字符。但是字符串(字符数组)与char
变量不同,因为它始终以空字符\0
或数字0
结束。所以在scanf
中你明确提到了你是在读字符还是字符串,以便scanf
可以在字符串的末尾添加一个空字符。因此,您不应该使用%s
来读取char
变量的值