我想从文本文件中读取每个单词的第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;
}
答案 0 :(得分:5)
我想找到每个单词的第5个字母
这不是你的代码现在正在做的事情。出于各种原因这是错误的,例如
char ch[]={'\0'};
是一个长度为1且未绑定ch[i]
的数组,您正在超出创建undefined behaviour的已分配内存。gets()
非常危险,可能导致缓冲区溢出。getc()
读取逐个字符,而不是逐字逐句,因此您还需要将空格字符(' '
)作为分隔符。 等
我的建议是,使用以下算法重写代码。
答案 1 :(得分:2)
您可以使用以下代码段。使用此代码,您需要知道最大行长。如果长度为5或更长,此代码会在每个单词的每行上打印第5个字符。。希望这对你有用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LINE 1000
int main()
{
char fname[30];
char myCurLine[MAX_LINE + 1];
char myCurWord[MAX_LINE + 1];
int index,loop;
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
{
if(fgets(myCurLine,MAX_LINE,fp) != NULL)
{
index = 0;
for(loop = 0;loop < MAX_LINE; loop++)
{
myCurWord[index] = myCurLine[loop];
index++;
if((myCurLine[loop] == ' ') || (myCurLine[loop] == '\n'))
{
myCurWord[index] = '\0';
index = 0;
if(strlen(myCurWord) > 4)
{
putchar(myCurWord[4]);
}
index = 0;
if(myCurLine[loop] == '\n')
break;
}
}
}
if(feof(fp))
{
break;
}
}while(1);
fclose(fp);
}
return 0;
}
答案 2 :(得分:1)
由于以下原因,我修改了您的代码:
您根本不需要使用warSourceDirectory
数组,因为您只检查字母,并且可以计算文件中每个字的字母(可以是使用空格检查)并在计数达到char
时打印(因为我们从4
开始)。
由于0
没有溢出保护,因此gets()
更受欢迎。
fgets()
另一点是,您可以将fgets(fname, sizeof(fname), stdin);
循环简化为一个do-while
循环,如果达到while
,条件为中断,因为您的EOF
只是一个无限循环(条件定义为do-while
或true
)在1
处断开(在无限EOF
内的单独if
中检查)。< / p>
do-while
while (!feof)
数组的替代方法是循环,直到找到空格char
或换行符' '
。
我还从'\n'
删除了else
以避免太多缩进。
if (fp==0)
来检查第5个字母是否真的是使用ctype.h
的字母。这就是“第5个字母搜索”的用法:
- 循环(外循环),直到文件结束(
isalpha()
)。- 醇>
在外循环的每次迭代中,循环( 内循环 ),直到空格
EOF
或换行{找到{1}}。
- 如果 内循环 中的计数器达到
' '
(表示已达到第5个字母),
- 打印当前的信件,
- 将计数器重置为零,
- 然后打破 内循环 。
将这些修改应用于您的代码,
'\n'
*注意:输出中不包含少于5个字母的单词,但您可以指定一个字符或数字来表示单词少于5个字母。 (例如4
, #include<stdio.h>
#include<conio.h>
#include<ctype.h>
int main(void){
char fname[30];
char ch; // changed from array to single char
int i=0;
FILE *fp;
printf("enter file name with path\n");
fgets(fname, sizeof(fname), stdin); // changed from gets()
// removes the \n from the input, or else the file won't be located
// I never encountered a file with newlines in its name.
strtok(fname, "\n");
fp=fopen(fname,"r");
// if file open failed,
// it tells the user that file doesn't exits,
// then ends the program
if (!fp) {
printf("file does not exist\n");
return -1;
}
// loops until end-of-file
while (!feof(fp))
// loops until space or newline or when 5th letter is found
for (i = 0; (ch=getc(fp)) != ' ' && ch != '\n'; i++)
// if 5th character is reached and it is a letter
if (i == 4 && isalpha(ch)) {
putc(ch ,stdout);
// resets letter counter, ends the loop
i = 0;
break;
}
fclose(fp);
return 0;
}
)
示例 0
:
-1
输出:
read.txt