[英]Reading a character with scanf_s
我只是在摆弄 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 的现场经验。
根据 msdn :
与 scanf 和 wscanf 不同,scanf_s 和 wscanf_s 要求为 c、C、s、S 类型的所有输入参数或包含在 [] 中的字符串控制集指定缓冲区大小。 以字符为单位的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。
…
在字符的情况下,单个字符可能读作如下:
字符 c;
scanf_s("%c", &c, 1);
使用scanf_s
你必须提供一个长度 [1] :
char c;
scanf_s("%c", &c, 1);
在scanf_s
的情况下,将%c
视为%1c
的特殊快捷方式,这使这一点更加清晰。
MSDNAA 指出 [1]:
与 scanf 和 wscanf 不同, scanf_s 和 wscanf_s 要求为
c
、C
、s
、S
[...] 类型的所有输入参数指定缓冲区大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.