scanf()正在扫描一个字符,而该字符尚未初始化

e0bqpujr  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(120)

有人能给我解释一下为什么card_T2在屏幕上显示之前就开始扫描了吗?

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”这样的东西,但是如果我在输入后按回车键,回车键就会被扫描到card_T2[0]上,我不明白为什么。
另外,如果我输入“456”之类的内容,然后按回车键、card_T1[0] = 4card_T1[1] = 5card_T2[0] = 6card_T2[1] = "space"
我不明白为什么第三和第四个scanf是扫描,虽然printf从来没有得到显示。

2w3rbyxf

2w3rbyxf1#

尝试在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]中。以下示例显示了在这些更改之后您运行的程序的外观(“键入翻牌卡2:“之前有”1“,因为您在打印card_T1[1]之后忘记输入\n(或者因为您不想输入)):

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

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

相关问题