【问题标题】:scanf() is scanning a character before it should even be initializedscanf() 在初始化之前扫描一个字符
【发布时间】:2024-01-07 16:17:01
【问题描述】:

有人可以向我解释为什么“card_T2”甚至在“printf("Type in flop card 2: \n");”之前就开始扫描吗?显示在屏幕上?

char card_T1[2];
char card_T2[2];

printf("Type in flop card 1: \n");

scanf("%c",&card_T1[0]);    //Card value
scanf("%c",&card_T1[1]);    //Card categorie

printf("%c\n",card_T1[0]);
printf("%c",card_T1[1]);

printf("Type in flop card 2: \n");

scanf("%c",&card_T2[0]);    //Card value
scanf("%c",&card_T2[1]);    //Card categorie

printf("%c\n",card_T2[0]);
printf("%c",card_T2[1]);

return 0;

我希望第一个 scanf 扫描类似“2k”的内容,但是如果我在输入后按 Enter,则输入会被扫描到“card_T2[0]”。我不明白为什么。

如果我输入类似“456”的内容然后按回车键,card_T1[0] = 4、card_T1[1] = 5、card_T2[0] = 6 和 card_T2[1] = “空格”。

我不明白为什么第 3 和第 4 个 scanf 正在扫描,尽管 printf 从未显示。

感谢您的帮助

【问题讨论】:

  • scanf() 中的 %c 后不应使用空格
  • 天哪,我的坏人已经删除了它们,问题仍然存在
  • 好吧,您已经创建了一个字符数组,并且由于 c 中不存在字符串,因此当您在键盘中输入“456”然后回车时,您的 4 个 scanf 中的每一个都会被执行并存储字符 4、5、6 和分别输入。 “2k”也是如此
  • 那我该怎么做呢?还是不可能
  • 用 %2a 完成了,所以只有前两个对 scanf 很重要。 scanf("%2s",&card_T1);

标签: scanf


【解决方案1】:

尝试在 scanf 语句中使用 %s 而不是 %c(%c 在 printf 语句中保持不变)。这将阻止程序在您按下一个字符并随后输入后继续扫描 card_T1[1]。但是,您必须一次按一个字符,然后再输入。如果你按'2k'并在之后输入(第一次输入),只有字符'2'将存储在card_T1 [0]中,没有任何内容存储在cardT1 [1]中(当然也没有在card_T2 [ 0] 或 card_T2[1])。如果按'2',然后输入,然后'k',然后输入,'2'将存储在card_T1[0]中,'k'存储在card_T2[1]中。以下是这些更改后您运行的程序的示例(在“Type in flop card 2:”之前有 '1',因为您在打印 card_T1[1] 后忘记输入 \n (或者因为您没有我不想)):

Type in flop card 1: 
qwerty
123
q
1Type in flop card 2:
3
4
3
4 

这是因为 char 数组中的每个位置只有 1 个字节,每个字符也是 1 个字节,所以只有 1 个字符可以适合 char 数组的位置。至于为什么 %s 而不是 %d 解决了我也不知道的第一个问题。

【讨论】:

    最近更新 更多