C语言 scanf 读取用户输入, 一些笔记,记录。

原因: 

scanf  %c 读取字符时, 不会跳过任何空白字符(包括空格、制表符等)!

起因: scanf 太常用了。问题也多。做一下记录。以后再随时补充。

问题1: while 循环里面多次执行?

#include <stdio.h>

void just_read() {
    printf("Enter 3 characters:\n");

    char what;
    int row, col;

    while (scanf("%c %d %d", &what, &row, &col) != EOF) {
        // while 这里面执行了很2次。
        printf("what=%c, row: %d, col: %d \n", what, row, col); 
        printf("\n\n");
    }
}
 
int main(void) {
    just_read();
    
    return 0;
}

输出:

原因分析:

这段代码中的while循环设计有问题,它会导致循环体执行两次的原因如下:

  1. 当用户输入三个字符时,scanf首先读取第一个字符(%c),然后尝试读取接下来的两个整数(%d %d)。但是,由于%c读取字符时不会跳过任何空白字符(包括空格、制表符等),如果用户在输入字符后直接输入两个数字,scanf会将第一个数字前的空白字符(如果有的话)也当作%c的输入。

  2. 假设用户输入了'a' 1 2scanf会读取'a'作为what变量的值,然后尝试读取1作为row变量的值。但是,由于%c在读取'a'时没有跳过后面的空格,scanf在尝试读取row时会立即成功,因为空格被当作了%c的输入,而没有触发scanf的失败。

  3. 由于scanf在读取%c后没有遇到任何错误,它会继续尝试读取%d %d。这时,scanf会读取12作为rowcol的值。

  4. 因此,即使用户只输入了三个字符,scanf也会认为它成功读取了三个值(一个字符和两个数字),这导致while循环条件scanf("%c %d %d", &what, &row, &col) != EOF为真,循环体执行。

  5. 循环体执行后,scanf会再次尝试读取输入,但由于没有更多的输入,scanf将返回EOF,循环结束。

解决办法: 

要修复这个问题,你可以在%c%d %d之间添加一个空格,以确保scanf在读取字符后跳过任何空白字符。修改后的代码如下:

#include <stdio.h>

void just_read() {
    printf("Enter 3 characters:\n");

    char what;
    int row, col;

    while (scanf(" %c %d %d", &what, &row, &col) != EOF) { // 添加了一个空格
        // while 现在应该只执行一次。
        printf("what=%c, row: %d, col: %d \n", what, row, col); 
        printf("\n\n");
    }
}
 
int main(void) {
    just_read();
    
    return 0;
}

现在就正常了。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值