阅读与scanf_s字符阅读与scanf_s字符(Reading a character with

2019-05-12 11:10发布

我只是瞎搞与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);

}

见程序输出

Answer 1:

你是滥用scanf_s() 微软编译器会警告你使用他们的安全扩展 (又名C11附件K)。 但是,如果你这样做,所以要小心。 scanf_s()不是直接替换scanf()

在这种情况下,你必须输出缓冲区的大小通过一个额外的参数。

char c;

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

不必把一1作为单个字符的大小可能会显得有点迂腐。 这是因为%c可以读取任何数量的字符。 %c是仅有的别名%1c (单个字符)。

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

根据MSDN :

不像的scanf和wscanf,scanf_s和wscanf_s所需要的缓冲器大小为括在[]类型C,C,S,S,或串控制集合的所有输入参数被指定。 在字符缓冲区大小为紧接在指针到缓冲器或可变以下附加的参数传递。

...

在字符的情况下,单个字符可被修改如下:

炭℃;

scanf_s( “%C”,&amp; C,1);



Answer 2:

随着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



Answer 3:

的文档scanf_s说:

在字符的情况下,单个字符可被修改如下:

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

所以下面应该工作(见现场演示这里 )

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


文章来源: Reading a character with scanf_s