从文件读取一行至char数组并遇换行终止的程序问题求助
问题分析与修复方案
嘿,我看看你的代码问题出在哪——你现在的逻辑确实有几个明显的漏洞,导致没拿到预期的"Hello",反而只输出了"llo"和乱码。咱们一步步理清楚:
1. 第一个字符被直接丢弃了
你外层的while循环先用fgetc(fp)读了文件的第一个字符'H',但这个字符根本没存到数组里,直接就进入内层for循环了。紧接着在for里又用fscanf读下一个字符'e',等于直接把'H'扔了,这就是为什么输出少了前两个字符的原因。
2. 字符串没加终止符\0
C语言里的字符串必须以\0结尾才能被printf("%s")正确识别,你只往数组里塞了读取到的字符,没加这个终止符,所以printf会一直读到数组里的随机垃圾内容,就出现了无效字符。
3. 嵌套循环完全没必要
外层while和内层for的嵌套把读取逻辑搞乱了,重复读取字符不说,还容易出现逻辑冲突,其实一个循环就能搞定读取到换行符的需求。
修复后的代码
#include <stdio.h> #include <stdlib.h> int main() { char random[100]; FILE *fp = fopen("testing.txt", "r"); if (fp == NULL) { printf("Can't open the file\n"); exit(1); } int i = 0; char c; // 读取字符,直到碰到换行符或者文件结束 while ((c = fgetc(fp)) != EOF && c != '\n') { // 加个判断防止数组溢出,更安全 if (i < 99) { // 留一个位置给终止符'\0' random[i++] = c; } else { break; // 数组满了就停,避免越界 } } // 一定要加字符串终止符! random[i] = '\0'; printf("%s\n", random); fclose(fp); // 原代码没关文件,补上避免资源泄漏 return 0; }
关键改进说明
- 修复读取逻辑:用单个
while循环控制读取,每读一个字符就判断是否是换行符/EOF,符合条件就存入数组,不会再丢失第一个字符。 - 添加终止符:读取完成后给数组最后一个位置赋值
'\0',保证printf能正确识别字符串边界。 - 越界保护:加入
i < 99的判断,防止文件内容过长导致数组溢出,这是个很重要的安全习惯。 - 关闭文件:原代码漏了
fclose(fp),会导致文件资源无法及时释放,现在补上了。
如果你的需求其实是只读取到空格前的"Hello"(而不是整行),那只需要把循环条件里的c != '\n'改成c != '\n' && c != ' '就行,这样读到空格就会停止,正好存入"Hello"。
内容的提问来源于stack exchange,提问作者Rivf
相关产品推荐
相关产品推荐

