C语言如何使用scanf正确读取逗号分隔输入并存入多个变量
异常输出原因
你的代码核心错误是scanf格式串写法错误:%19[^,]本身是完整的扫描集转换说明符,作用是读取所有非逗号的字符,你在后面额外加了s,会导致scanf在读完名字后尝试匹配输入流中的字面量s字符,但示例输入中Rohit Joshi后紧跟的是逗号,匹配直接失败,scanf中断后续所有读取操作,剩下的变量没有被赋值,因此输出空值或随机乱码。
基于scanf的正确写法
删除所有扫描集后的多余s,调整后的代码如下:
#include <stdio.h> int main(void) { int sn, price; char name[20], place1[20], place2[20], time[20]; // 移除所有扫描集后的多余s,严格匹配逗号+空格的分隔格式 scanf("%d, %19[^,], %19[^,], %19[^,], %19[^,], %d", &sn, name, place1, place2, time, &price); printf("sn=%d name=%s place1=%s place2=%s time=%s price=%d\n", sn, name, place1, place2, time, price); return 0; }
注意:%19的限制是为了留出1位存储字符串终止符\0,避免数组溢出。如果输入字段长度超过19会被自动截断,可根据实际业务需求调整数组大小和读取长度限制。
更推荐的实现方式
scanf对不规范输入的容错性很差,一旦输入格式和预期不符就会匹配失败,且残留垃圾字符在输入流中影响后续操作,更推荐以下方案:
- 先调用
fgets()读取整行输入到足够大的缓冲区,避免输入流残留问题 - 再调用
strtok()按逗号作为分隔符切割字符串,每个切割结果手动去除首尾空格后存入对应变量
这种方案可以灵活处理各种非标准输入场景,错误排查和边界处理也更简单。
内容的提问来源于stack exchange,提问作者Rohit Joshi
相关产品推荐
相关产品推荐

