我只是乱搞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()
可以防止缓冲区溢出(安全风险)。
与scanf和wscanf不同,scanf_s和wscanf_s要求为所有包含在[]中的c,C,s,S或字符串控件集的输入参数指定缓冲区大小。字符的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。
…
对于字符,可以按如下方式读取单个字符:
char 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
[...]类型的所有输入参数指定缓冲区大小。