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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:36:03