用scanf_s读取字符

用scanf_s读取字符,c,windows,visual-c++,c11,tr24731,C,Windows,Visual C++,C11,Tr24731,我只是和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); } #包括 内部主(空) { 字符c; printf(“您想成为X的还是O的?\n”);

我只是和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);

}
#包括
内部主(空)
{
字符c;
printf(“您想成为X的还是O的?\n”);
scanf_s(“%c”和“&c”);
printf(“您选择了%c\n”,c);
}

请参见
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
[…]的所有输入参数指定缓冲区大小


[1]

使用
scanf\u 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
[…]的所有输入参数指定缓冲区大小

[1]

的文档说明:

对于字符,单个字符可按如下方式读取:

char c;
scanf_s("%c", &c, 1);
因此,以下内容应该可以使用(请参阅现场演示)

#包括
内部主(空)
{
char i;
printf(“您想成为X的还是O的?\n”);
scanf_s(“%c”和i,1);
printf(“您选择了%c\n”,i);
}
的文档说明:

对于字符,单个字符可按如下方式读取:

char c;
scanf_s("%c", &c, 1);
因此,以下内容应该可以使用(请参阅现场演示)

#包括
内部主(空)
{
char i;
printf(“您想成为X的还是O的?\n”);
scanf_s(“%c”和i,1);
printf(“您选择了%c\n”,i);
}

您误用了
scanf\u s()
。Microsoft编译器可能会警告您使用其安全扩展(又名c11附录k)。但是,如果你这样做,要小心
scanf_s()
不能直接替代
scanf()

在这种情况下,必须将输出缓冲区的大小作为额外参数传递

char c;
 
scanf_s("%c", &c, 1);
把1作为单个字符的大小可能有点迂腐。这是因为
%c
可以读取任意数量的字符<代码>%c
只是
%1c
的别名(单个字符)

通过了解缓冲区大小
scanf_s()
旨在防止缓冲区溢出(安全风险)

尽管如此,这些功能到底有多大帮助仍有争议。请参阅:

:

与scanf和wscanf不同,scanf_和wscanf_需要缓冲区大小 为c、c、s、s或字符串类型的所有输入参数指定 包含在[]中的控件集。缓冲区大小(以字符为单位)为 作为指向的指针后面的附加参数传递 缓冲区或变量

对于字符,单个字符可按如下方式读取:

char c;
scanf_s("%c", &c, 1);
字符c

scanf_s(“%c”&c,1)


您误用了
scanf\u s()
。Microsoft编译器可能会警告您使用其安全扩展(又名c11附录k)。但是,如果你这样做,要小心
scanf_s()
不能直接替代
scanf()

在这种情况下,必须将输出缓冲区的大小作为额外参数传递

char c;
 
scanf_s("%c", &c, 1);
把1作为单个字符的大小可能有点迂腐。这是因为
%c
可以读取任意数量的字符<代码>%c只是
%1c
的别名(单个字符)

通过了解缓冲区大小
scanf_s()
旨在防止缓冲区溢出(安全风险)

尽管如此,这些功能到底有多大帮助仍有争议。请参阅:

:

与scanf和wscanf不同,scanf_和wscanf_需要缓冲区大小 为c、c、s、s或字符串类型的所有输入参数指定 包含在[]中的控件集。缓冲区大小(以字符为单位)为 作为指向的指针后面的附加参数传递 缓冲区或变量

对于字符,单个字符可按如下方式读取:

char c;
scanf_s("%c", &c, 1);
字符c

scanf_s(“%c”&c,1)


您输入了什么?这似乎是windows特有的。在linux中使用scanf。为什么不按照
scanf_s
的文档进行操作?您输入了什么?这似乎是windows特有的。在linux中使用scanf。为什么不按照
scanf\u s
的文档进行操作?