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

C语言scanf在%c前加空格仍跳过输入甚至跳过更多提示项问题求助

问题原因

你代码里的异常是两个核心错误共同导致的:

  • 格式符使用错误:firstN、lastN、email、address都是char类型数组,用于存储字符串,但你全部用了仅能读取单个字符的%c格式符读取,单次只能存入1个字符,剩下的输入内容(包括输入完按下的换行符)全部残留在输入缓冲区,被后续的scanf直接读取,造成输入被跳过的假象。另外数组名本身就是首地址指针,传入scanf时不需要额外加&符号,加了反而会出现类型不匹配的问题。
  • 换行符残留处理不当:%d格式符读取整数后,只会吃掉输入的数字部分,按下的换行符会残留在缓冲区中,后续如果用不跳过前导空白的%c读取字符时,会直接读到这个残留的换行符,导致输入被跳过。
解决方案

修改NewCustomer函数的输入逻辑,字符串用%s格式符读取(该格式符默认会跳过前导空白字符),单个字符读取前加空格吃掉残留空白:

void NewCustomer()
{
    char firstN[10], lastN[10],email[50],address[100],CNA;
    int Ic,contact;
    printf("Enter First Name:\n");
    // %s读取字符串,数组名直接传即可,不需要&
    scanf("%s", firstN);
    printf("Enter Last Name:\n");
    scanf("%s", lastN);
    printf("Enter I/C No:\n");
    scanf("%d",&Ic);
    printf("Enter Address:\n");
    // 注意:%s读到空白就停止,如果要输入带空格的地址,建议改用fgets读取
    scanf("%s", address);
    printf("Enter Contact No:\n");
    scanf("%d",&contact);
    printf("Enter email address:\n");
    scanf("%s", email);
    printf("Create New Account (Y/N)?:\n");
    // 单个字符前加空格,吃掉前面残留的换行符
    scanf(" %c",&CNA);
}
补充注意事项
  1. 你代码开头定义的全局数组int Ic[12];、int contact[10];和NewCustomer里的局部变量int Ic,contact;重名,局部变量会覆盖全局变量的作用域,如果需要全局存储客户信息,注意不要重复定义同名局部变量。
  2. 如果需要读取带空格的地址、姓名等内容,建议使用fgets()函数读取整行输入,可以避免%s只能读到空白的问题,同时也能更方便的处理换行符残留。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:45:05