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

使用fgets与strlen时程序无法检测空输入的终止符问题

问题:fgets处理空输入时strlen返回1而非0的问题

当仅按下回车键(未输入任何内容)时,用fgets读取输入后调用strlen得到的长度是1,而非预期的0,且无法通过input[0] == '\0'检测到空输入。

问题代码

int func(char *input) {
    if (input[0] == '\0')
        printf("null detected\n");
    else
        printf("null not detected\n");

    printf("len: %lu", strlen(input));
}


int main() {
    char input[256];
    fgets(input, sizeof(input), stdin);
    func(input);
    return 0;
}

当前输出

null not detected
len: 1

期望输出

null detected
len: 0


原因分析

fgets的特性是会将用户按下回车键产生的**换行符\n**也读取到缓冲区中。当仅按回车键时,input数组中实际存储的是"\n\0":第一个字符是换行符,第二个是空终止符。因此input[0]不等于'\0',strlen统计到换行符的长度,返回1。


解决方案

方法一:读取后移除换行符(推荐)

在调用fgets后,将输入字符串末尾的换行符替换为空终止符,这样空输入就会变成标准的空字符串"\0"。

修改后的main函数代码:

int main() {
    char input[256];
    if (fgets(input, sizeof(input), stdin) != NULL) {
        // 用strcspn定位换行符并替换为空终止符
        input[strcspn(input, "\n")] = '\0';
    }
    func(input);
    return 0;
}

strcspn(input, "\n")会返回input中第一个换行符的索引位置,直接将该位置设为'\0'即可移除换行符。处理后,空输入的input数组首字符就是'\0',func会输出预期的"null detected",strlen返回0。

方法二:直接判断首字符是否为换行符

如果不需要修改原输入字符串,也可以在检测空输入时,额外判断首字符是否是换行符:

修改后的func函数代码:

int func(char *input) {
    if (input[0] == '\0' || input[0] == '\n')
        printf("null detected\n");
    else
        printf("null not detected\n");

    printf("len: %lu", strlen(input));
}

这种方法直接将首字符为换行符的情况视为空输入,不需要修改原字符串,但输入字符串中仍会保留换行符,strlen仍会返回1,仅满足检测空输入的需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:05:14