为什么我不能使用%s代替%c?

时间:2018-05-02 16:30:43

标签: c string char scanf

问题的全部功能是关于给出一个用{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一无所知,一个答案说的是问题的原因所以我宁愿在没有它的情况下得到答案。 谢谢你的回答

2 个答案:

答案 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变量的值