使用scanf_s读取字符

问题描述 投票:1回答:3

我只是乱搞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

c windows visual-c++ c11 tr24731
3个回答
2
投票

你在滥用scanf_s()。 Microsoft编译器可能会警告您使用其安全扩展(也称为c11附录k)。但是,如果你这样做,要小心。 scanf_s()不是scanf()的直接替代品。

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

char c;

scanf_s("%c", &c, 1);

必须将1作为单个字符的大小可能看起来有点迂腐。那是因为%c可以读取任意数量的角色。 %c只是%1c(一个字符)的别名。

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

According to msdn

与scanf和wscanf不同,scanf_s和wscanf_s要求为所有包含在[]中的c,C,s,S或字符串控件集的输入参数指定缓冲区大小。字符的缓冲区大小作为附加参数传递,紧跟在指向缓冲区或变量的指针之后。

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

char c;

scanf_s(“%c”,&c,1);


1
投票

使用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


1
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.