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

使用scanf("%[^\n]%*c")读取含空格与空行文本失败的求助

解决scanf无法读取空行的问题

嘿,这个问题我太熟了!咱们先搞清楚为什么scanf("%[^\n]%*c", name)读不了空行——因为%[^\n]的规则是只匹配不等于换行符的字符,空行里全是换行符,它直接就跳过了,根本不会往name里写东西,后面的%*c也只会吃掉那个换行,但空行本身就没被捕获到。你之前在格式串末尾加\n也没用,因为scanf里的空白字符(包括\n)会自动跳过所有空白(空格、换行、制表符等),还是会直接忽略空行的换行符。

下面给你两个靠谱的解决方案:

方案1:用getchar配合scanf手动处理空行

先读取一个字符判断是不是换行(空行的标志),如果是就直接处理空行;如果不是,把字符放回输入流,再用原来的scanf读取非空行:

#include <stdio.h>
#include <string.h>

int main() {
    char name[100];
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\n') {
            // 处理空行:把name设为空字符串
            name[0] = '\0';
            printf("捕获到空行:「%s」\n", name);
            continue;
        }
        // 把读取到的非换行字符放回输入流
        ungetc(c, stdin);
        // 读取非空行,%*c吃掉末尾的换行
        scanf("%[^\n]%*c", name);
        printf("捕获到非空行:「%s」\n", name);
    }
    return 0;
}

方案2:用fgets(更推荐!)

fgets()是处理行输入的利器,它会读取包括换行符在内的整行内容,自然也能捕获空行(空行就是一个单独的换行符)。你只需要在读取后手动去掉末尾的换行符即可:

#include <stdio.h>
#include <string.h>

int main() {
    char name[100];
    while (fgets(name, sizeof(name), stdin) != NULL) {
        // 去掉末尾的换行符(如果存在)
        size_t len = strlen(name);
        if (len > 0 && name[len - 1] == '\n') {
            name[len - 1] = '\0';
        }
        // 此时name就是整行内容,空行的话就是空字符串
        printf("捕获到行:「%s」\n", name);
    }
    return 0;
}

为什么更推荐fgets?因为它天生支持所有行类型,不仅能处理空行,还能避免scanf常见的缓冲区溢出问题(只要你指定了正确的缓冲区大小),用法也更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:56:24