我只是在搞乱 C 并遇到了这个小问题。正如您从我的输出中看到的那样,我得到了“╠”这个字符。
#include <stdio.h>
int main(void)
{
char c;
printf("Do you want to be X's or O's?\n");
scanf_s("%c", &c);
printf("You chose %c\n", c);
}
查看程序输出
你在滥用scanf_s()
. Microsoft 编译器可能会警告您使用他们的安全扩展(又名 c11 附件 k)。但是,如果你这样做,要小心。scanf_s()
不能直接替代scanf()
.
在这种情况下,您必须将输出缓冲区的大小作为额外参数传递。
char c;
scanf_s("%c", &c, 1);
必须将 1 作为单个字符的大小可能看起来有点迂腐。那是因为%c
可以读取任意数量的字符。%c
只是%1c
(单个字符)的别名。
通过知道缓冲区大小scanf_s()
旨在防止缓冲区溢出(安全风险)。
虽然,这些功能真正有多大帮助是值得商榷的。请参阅:附件 K 的现场经验。
与 scanf 和 wscanf 不同,scanf_s 和 wscanf_s 需要为类型 c、C、s、S 或包含在 [] 中的字符串控制集的所有输入参数指定缓冲区大小。以字符为单位的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。
…</p>
在字符的情况下,单个字符可以按如下方式读取:
字符 c;
scanf_s("%c", &c, 1);
您scanf_s
必须提供长度 [1] :
char c;
scanf_s("%c", &c, 1);
在scanf_s
think of %c
to 是 的特殊快捷方式的情况下%1c
,这更清楚了。
MSDNAA 状态 [1]:
c
与 scanf 和 wscanf 不同,scanf_s 和 wscanf_s 需要为所有类型为,C
,s
,S
[...]的输入参数指定缓冲区大小。
scanf_s的文档说:
在字符的情况下,单个字符可以按如下方式读取:
char c;
scanf_s("%c", &c, 1);
所以以下应该可以工作(请参阅此处的现场演示)
#include <stdio.h>
int main(void)
{
char i;
printf("Do you want to be X's or O's?\n");
scanf_s("%c",&i,1);
printf("You chose %c\n", i);
}