使用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要求为cCsS […]类型的所有输入参数指定缓冲区大小。

[1] https://msdn.microsoft.com/en-us/library/w40768et.aspx