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

关于C语言fgetc()代码中为何用j-2添加字符串结束符的疑问

问题原因分析

你的代码里的do-while循环逻辑和feof的使用时机导致了计数偏差和垃圾值问题:

  • 循环多执行一次:do-while是先执行循环体再判断条件。当读完文件最后一个有效字符后,feof(fp_t)仍然为0(还没尝试读取超过文件末尾),所以循环会额外执行一次。
  • j的额外增量:最后一次循环中,fgetc返回EOF,此时feof(fp_t)被置为非0,代码不会把EOF写入note数组,但j还是会自增一次。
  • 垃圾值导致的换行:假设文件有N个有效字符,循环结束后j = N + 1。此时note[N]是未初始化的垃圾值,当你用j-1设置'\0'时,这个垃圾值(刚好是'\n')会被包含在字符串中,导致输出末尾多出换行。
  • j-2有效的原因:额外循环的j增量导致j比有效字符数多1,用j-2设置'\0'刚好能截断到有效字符的末尾,避开未初始化的垃圾值区域。

正确的代码写法

应该用ch != EOF判断读取是否成功,避免feof的时机问题,同时注意fgetc返回值必须用int类型存储(因为EOF是int类型的-1):

fp_t = fopen(temp_name, "r");
int j = 0;
int ch; 
while ((ch = fgetc(fp_t)) != EOF) {
    all[i].note[j++] = (char)ch;
}
all[i].note[j] = '\0';
fclose(fp_t);

这种写法下,j的数值等于有效字符的个数,直接在j的位置设置'\0'即可,不会出现计数偏差或垃圾值问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:24:50