使用 scanf_s 读取一个字符
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);
}
见program output
对于 scanf_s
,您必须提供长度 [1] :
char c;
scanf_s("%c", &c, 1);
在 scanf_s
的情况下,将 %c
视为 %1c
的特殊快捷方式,这样就更清楚了。
MSDNAA 声明 [1]:
Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c
, C
, s
, S
[...].
scanf_s 的文档说:
如果是字符的话,单个字符可以这样读:
char c;
scanf_s("%c", &c, 1);
所以下面应该有效(查看现场演示 here)
#include <stdio.h>
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()
。 Microsoft 编译器可能会警告您使用他们的 安全扩展 (又名 c11 附件 k)。但是,这样做时要小心。 scanf_s()
不是 scanf()
的直接替代品。
在这种情况下,您必须将输出缓冲区的大小作为额外参数传递。
char c;
scanf_s("%c", &c, 1);
必须将 1 作为单个字符的大小似乎有点迂腐。那是因为 %c
可以读取任意数量的字符。 %c
只是 %1c
(单个字符)的别名。
通过了解缓冲区大小 scanf_s()
旨在防止缓冲区溢出(安全风险)。
尽管如此,这些功能到底有多大帮助还值得商榷。参见:Field Experience With Annex K.
Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size
to be specified for all input parameters of type c, C, s, S, or string
control sets that are enclosed in []. The buffer size in characters is
passed as an additional parameter immediately following the pointer to
the buffer or variable.
…
In the case of characters, a single character may be read as follows:
char c;
scanf_s("%c", &c, 1);
我只是在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);
}
见program output
对于 scanf_s
,您必须提供长度 [1] :
char c;
scanf_s("%c", &c, 1);
在 scanf_s
的情况下,将 %c
视为 %1c
的特殊快捷方式,这样就更清楚了。
MSDNAA 声明 [1]:
Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type
c
,C
,s
,S
[...].
scanf_s 的文档说:
如果是字符的话,单个字符可以这样读:
char c;
scanf_s("%c", &c, 1);
所以下面应该有效(查看现场演示 here)
#include <stdio.h>
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()
。 Microsoft 编译器可能会警告您使用他们的 安全扩展 (又名 c11 附件 k)。但是,这样做时要小心。 scanf_s()
不是 scanf()
的直接替代品。
在这种情况下,您必须将输出缓冲区的大小作为额外参数传递。
char c;
scanf_s("%c", &c, 1);
必须将 1 作为单个字符的大小似乎有点迂腐。那是因为 %c
可以读取任意数量的字符。 %c
只是 %1c
(单个字符)的别名。
通过了解缓冲区大小 scanf_s()
旨在防止缓冲区溢出(安全风险)。
尽管如此,这些功能到底有多大帮助还值得商榷。参见:Field Experience With Annex K.
Unlike scanf and wscanf, scanf_s and wscanf_s require the buffer size to be specified for all input parameters of type c, C, s, S, or string control sets that are enclosed in []. The buffer size in characters is passed as an additional parameter immediately following the pointer to the buffer or variable.
…
In the case of characters, a single character may be read as follows:
char c;
scanf_s("%c", &c, 1);