You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中第二个scanf()函数无法接收输入的原因及解决方法

问题产生原因

使用scanf("%c", &变量)读取单个字符时,%c格式符不会自动跳过输入缓冲区中的空白字符(包括换行符\n、空格、制表符等)。
当你在第一个输入提示下输入小写字母后按下回车键,输入的字母会被第一个scanf读入变量u,但按下回车产生的换行符\n会残留在标准输入缓冲区中。执行到第二个scanf("%c", &v)时,函数会直接读取缓冲区里残留的这个换行符赋值给v,不会等待用户输入新的内容,因此表现为第二个输入步骤被直接跳过。

修复方法

有两种常用的可靠修复方案:

  • 方案1:在第二个scanf的%c前加一个空格,修改为scanf(" %c", &v);
    格式串开头的空格会告知scanf跳过读取前所有的空白字符,直到遇到第一个非空白字符才开始正式读入,这种写法可以自动处理缓冲区残留的任意数量空白字符,是最简便稳妥的方案。
  • 方案2:在两个scanf调用之间手动消耗掉缓冲区残留的换行符,插入一行getchar();即可读走第一个输入后留下的回车。注意该方法仅能处理残留单个换行的场景,如果第一个输入后存在多个多余空白字符会出现读取异常。

额外优化建议:原代码中通过u-32、v+32计算大小写转换的写法兼容性较差,并非所有字符编码环境下大小写字母的ASCII差值都是32,可以引入<ctype.h>头文件,使用标准库提供的toupper()、tolower()函数完成大小写转换,鲁棒性更强。

修复后参考代码
#include<stdio.h>
#include<ctype.h>

int main()
{
    char u, v;
    printf("Enter lowercase character :");
    scanf("%c",&u);
    printf("Uppercase is : %c\n", toupper(u));
    printf("Enter uppercase character :");
    scanf(" %c",&v);
    printf("Lowercase is : %c\n", tolower(v));
    return 0;
}

内容的提问来源于stack exchange,提问作者Rifat Al Emam Shoron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:39:33