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

使用scanf的%[^,]格式符读取标准输入时第二个变量无法输出问题

问题原因分析
  • %[^,]是scanf的否定扫描集格式符,规则为读取输入缓冲区中所有不等于逗号的字符,直到遇到逗号为止,但不会主动丢弃匹配终止位置的逗号,该逗号会残留在输入缓冲区中。
  • 第一个scanf("%[^,]",word)执行完成后,输入缓冲区的第一个字符就是未被读取的逗号,第二个scanf("%[^,]",cat)启动后第一个字符就匹配到逗号,直接匹配失败返回0,不会给cat变量写入任何有效内容,因此cat中保留的是栈内存的初始垃圾值,自然无法正常输出。
修复方案

可选择以下任意一种方案处理残留的逗号:

  1. 两次读取之间添加丢弃逗号的逻辑:
#include <stdio.h>
#include<string.h>

int main() {
    char word[20];
    char cat[20];
    printf("Enter the thing:");
    scanf("%[^,]",word);
    getchar(); // 读取并丢弃缓冲区中残留的逗号
    scanf("%[^,]",cat);
    printf("%s",word);
    printf("%s",cat);
    return 0;
}
  1. 直接修改第二个scanf的格式串,主动匹配跳过前置逗号:
scanf(",%[^,]",cat);
额外注意事项

如果输入内容中不存在逗号,%[^,]会一直读取到换行符或者输入结束为止,存在数组越界的风险,建议写成%19[^,]限制最大读取长度,避免缓冲区溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:54:02