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

}

查看程序输出

4

3 回答 3

2

你在滥用scanf_s(). Microsoft 编译器可能会警告您使用他们的安全扩展(又名 c11 附件 k)。但是,如果你这样做,要小心。scanf_s()不能直接替代scanf().

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

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

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

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

虽然,这些功能真正有多大帮助是值得商榷的。请参阅:附件 K 的现场经验

根据 msdn

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

…</p>

在字符的情况下,单个字符可以按如下方式读取:

字符 c;

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

于 2016-12-17T14:41:17.553 回答
1

scanf_s必须提供长度 [1] :

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

scanf_sthink of %cto 是 的特殊快捷方式的情况下%1c,这更清楚了。

MSDNAA 状态 [1]:

c与 scanf 和 wscanf 不同,scanf_s 和 wscanf_s 需要为所有类型为, C, s, S[...]的输入参数指定缓冲区大小。

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

于 2016-12-17T14:38:07.550 回答
1

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);
}
于 2016-12-17T14:38:22.083 回答