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
相关产品推荐
相关产品推荐

