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

