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

C语言读取任意长度字符串:两处代码实现疑问求解

关于你的C语言程序的两个疑问解答

1. while循环条件中的c != EOF是否必要?

必须保留这个判断,核心原因有两点:

  • 处理输入流提前终止场景:比如用户在终端输入时按Ctrl+D(Unix/Linux)或Ctrl+Z(Windows)直接结束输入,或者程序读取的是无换行结尾的文件,此时getchar()会返回EOF。如果没有这个判断,循环会因永远不满足!= '\n'而无限执行,还会把EOF(通常为-1)存入char变量——若编译器将char视为有符号类型,-1会被当作有效字符写入字符串,导致后续输出异常。
  • 符合输入处理规范:标准输入流的结束标志就是EOF,正确处理输入的程序必须考虑这种情况,避免不可预期的行为。

2. 能否移除malloc和realloc语句中的sizeof(char)表达式?

语法上完全可以移除,因为C标准明确规定sizeof(char)的值恒为1,所以malloc(sizeof(char))等价于malloc(1),buf * sizeof(char)等价于buf。但从代码的可读性和可维护性角度,更建议保留:

  • 可读性:明确写出sizeof(char)能让其他阅读者一眼看出是按单个字符大小分配内存,逻辑更清晰。
  • 可维护性:如果后续需要把char替换为其他字符类型(比如wchar_t),保留sizeof(char)只需修改类型声明,不用调整内存分配的计算部分,减少出错概率。
    若追求代码极致简洁,移除也不影响程序功能,完全合法。

你的程序代码

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *str = malloc(sizeof(char));

    if (!str)
        return 1;

    char c;
    char *reallocStr;
    size_t len = 0;
    size_t buf = 1;

    printf("Enter some text: ");

    while ((c = getchar()) != '\n' && c != EOF) {
        if (len == buf) {
            buf *= 2;

            reallocStr = realloc(str, buf * sizeof(char));

            if (!reallocStr)
                return 1;

            str = reallocStr;
        }

        str[len++] = c;
    }

    str[len] = '\0';

    printf("You entered: %s\n", str);

    free(str);
    
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:54:19