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

C语言EOF正确用法及文件内容反转代码换行问题咨询

问题解答

1. EOF输入操作是否正确?

在Windows系统的控制台环境中,「回车→Ctrl+Z→回车」的操作是正确的。Windows下控制台的EOF触发需要Ctrl+Z处于行首位置,先回车换行让Ctrl+Z单独占一行,再回车就能正确让getchar()返回EOF。

2. 最后一个单词换行的原因

代码存在两个关键问题导致该现象:

  • 你手动在文件末尾添加了空格putc(' ',ptr);,而输入内容最后会带有一个换行符(因为输入了回车),最终文件内容实际是输入内容\n 。
  • 读取逻辑只有遇到空格才会触发单词反转输出,当读到最后那个空格时,str里存储的是最后一个单词加换行符,strrev(str)会把换行符和单词反转,导致换行符被放到字符串开头,输出时先打印换行,再打印反转后的单词,因此最后单词出现在新行。

3. 代码修改方案

要实现输入内容原样反转输出(单词逐个反转,整体格式与输入一致),可做以下修改:

  1. 移除手动添加空格的代码putc(' ',ptr);,避免引入多余字符。
  2. 读取文件循环结束后,处理剩余未触发反转的单词(因为最后没有空格触发反转逻辑)。
  3. 将换行符也当作单词分隔符,处理换行时先输出反转的单词,再打印换行,保持原格式一致。
  4. 增大数组长度并增加越界检查,避免原代码中str[10]长度过小导致的数组溢出问题。

修改后的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
  int i=0;
  char ch,str[100]; // 增大数组容量,避免短单词数组溢出
  FILE *ptr;
  ptr=fopen("input.txt","w");
  if(ptr==NULL){
    printf("File error\n");
    exit(0);
  }
  while((ch=getchar())!=EOF){
    putc(ch,ptr);
  }
  fclose(ptr); // 移除手动添加空格的代码
  ptr=fopen("input.txt","r");
  if(ptr==NULL){ // 增加文件读打开失败的判断
    printf("File error\n");
    exit(0);
  }
  while((ch=getc(ptr))!=EOF){
    if(ch==' ' || ch=='\n'){ // 将换行符也视为单词分隔符
      if(i>0){ // 跳过连续空格/换行的空内容处理
        str[i]='\0';
        strrev(str);
        printf("%s",str);
        i=0;
      }
      printf("%c",ch); // 保留原输入的空格或换行
    } else {
      str[i]=ch;
      i++;
      // 增加数组越界检查,避免溢出崩溃
      if(i>=sizeof(str)-1){
        str[i]='\0';
        strrev(str);
        printf("%s",str);
        i=0;
      }
    }
  }
  // 处理文件末尾无分隔符的剩余单词
  if(i>0){
    str[i]='\0';
    strrev(str);
    printf("%s",str);
  }
  fclose(ptr);
  return 0;
}

内容的提问来源于stack exchange,提问作者100MIL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:29:56