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

如何让C语言中fscanf()读取空白字符并存储到变量中?

解决fscanf读取含空白字符列的问题

原代码的问题出在格式串的空白处理上:%c前后的空格会让fscanf自动跳过所有空白字符(空格、换行、制表符等),导致你无法将开头的空白读取到one变量中。此外,格式串末尾的\n和空格等价,同样会跳过空白,干扰行内元素的读取。

方案1:直接修改fscanf格式串

调整格式串,去掉%c前后的多余空白,改用精确的空白跳过规则:

char one, three;
char two[100];
// 先跳过所有换行符(行分隔),再读取第一个字符(含空格),然后跳过空格读取字符串,最后跳过空格读取第三个字符
while (fscanf(matrix, "%*[\n]%c%*[ ]%s%*[ ]%c", &one, two, &three) == 3) {
    // 处理读取到的三个元素
}
  • %*[\n]:跳过所有前置的换行符,避免把上一行的换行当成当前行的第一个元素
  • %c:读取当前位置的第一个字符(包括空格),不会跳过空白
  • %*[ ]:跳过任意数量的空格(不存储),用于分隔第一个字符和第二个字符串
  • %s:读取非空白的字符串(自动跳过前置空白,但这里已经用%*[ ]处理了,不冲突)
  • 最后的%*[ ]%c:跳过字符串和第三个字符之间的空格,读取第三个字符

方案2:用fgets+sscanf逐行处理(更可靠)

直接按行读取后再解析,避免流读取时的换行、空白干扰:

char line[256];
char one, three;
char two[100];
while (fgets(line, sizeof(line), matrix) != NULL) {
    // 解析单行内容:读取第一个字符→跳过空格→读取字符串→跳过空格→读取第三个字符
    int ret = sscanf(line, "%c%*[ \t]%s%*[ \t]%c", &one, two, &three);
    if (ret == 3) {
        // 成功读取三个元素,执行处理逻辑
    } else {
        // 处理解析失败的情况(比如行格式错误)
    }
}

这种方式更直观,也更容易调试每行的格式问题,适合处理按行组织的输入。

额外说明

如果第一个字段是连续的多个空白(比如第三行的两个空格),需要将所有空白存入字符串变量而非单个字符,可改用%[ ]格式:

char one[10];
sscanf(line, "%[ ]%*[ ]%s%*[ ]%c", one, two, &three);

这样one会存储开头的所有连续空格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:52:49