使用scanf_s读取字符
我只是乱搞C并遇到了这个小问题。 正如你从我的输出中看到的那样,我得到了’╠’这个角色。
#include "stdio.h" void main() { 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()
可以防止缓冲区溢出(存在安全风险)。
根据msdn :
与scanf和wscanf不同,scanf_s和wscanf_s要求为所有包含在[]中的c,C,s,S或字符串控件集的输入参数指定缓冲区大小。 字符的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。
…
对于字符,可以按如下方式读取单个字符:
char c;
scanf_s(“%c”,&c,1);
scanf_s的文档说:
对于字符,可以按如下方式读取单个字符:
char c; scanf_s("%c", &c, 1);
程序中的另一个问题是main()
返回类型必须始终为int
。 C标准不允许使用void main()
。
所以下面应该工作(见这里的现场演示)
#include 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); }
使用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
[…]类型的所有输入参数指定缓冲区大小。