使用 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 [...].

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

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.

According to msdn:

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);