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); }
补充注意事项
- 你代码开头定义的全局数组
int Ic[12];、int contact[10];和NewCustomer里的局部变量int Ic,contact;重名,局部变量会覆盖全局变量的作用域,如果需要全局存储客户信息,注意不要重复定义同名局部变量。 - 如果需要读取带空格的地址、姓名等内容,建议使用
fgets()函数读取整行输入,可以避免%s只能读到空白的问题,同时也能更方便的处理换行符残留。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

