打印从文本文件中读取的每个单词的第5个字母

0 c file-io

我想从文本文件中读取后,从每个单词中找到第5个字母.我不知道我哪里错了.

进入文件路径后,我会看到一个弹出窗口

read.c 已停止工作.

代码:

#include<stdio.h>
#include<conio.h>
int main(void){
  char fname[30];
  char ch[]={'\0'};
  int i=0;
  FILE *fp;
  printf("enter file name with path\n");
  gets(fname);
  fp=fopen(fname,"r");
  if(fp==0)
       printf("file doesnot exist\n");
  else{
       printf("File read successfully\n");
       do{
         ch[i]=getc(fp);
         if(feof(fp)){
             printf("end of file");
             break;
         }
         else if(ch[i]=='\n'){
             putc(ch[4],stdout);
        }
        i++;
    }while(1);
    fclose(fp);
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 5

我想找到每个单词的第5个字母

这不是你的代码现在正在做的事情.由于各种原因,这是错误的

  • char ch[]={'\0'};是一个长度为1的数组.在未绑定的情况下ch[i],您将超出分配的内存,从而创建 未定义的行为.
  • gets() 非常危险,它可能导致缓冲区溢出.
  • getc()逐个字符地读取,而不是逐字逐句,因此您还需要将空格字符(' ')作为分隔符.

等等

我的建议,使用以下算法重写您的代码.

  1. 分配足够长的缓冲区以保存文件中的完整.
  2. 打开文件,检查是否成功.
  3. 使用读取整行到缓冲区 fgets()

    3.1.如果fgets()返回NULL,则很可能已到达文件末尾.结束.

    3.2.否则,继续下一步.

  4. 使用空格作为分隔符来对进行标记.检查返回的令牌是否为NULL.strtok()' '

    4.1.如果token为NULL,请转到步骤3.

    4.2.如果token不为NULL,则继续执行下一步.

  5. 检查strlen()返回的令牌(这是单词).如果超过4,则打印令牌的索引 4.(请记住,数组索引c0基于的).

  6. 继续第4步.