大家好,我有一个关于代码C的问题:读取包含5个字符串的输入数据(input02.txt),然后将每个字符串的长度写入新文件。文件中的字符串:
Five little
Monkeys jumping
On the bed
One fell off
And bumped his head这是我的代码:
#include <stdio.h>
#include <string.h>
int main(){
char s[100];
int m,c=1;
FILE *fin,*fout;
fin = fopen("input02.txt", "r");
fout = fopen("length.txt", "w");
if (fin!=NULL){
while(!feof(fin)){
fgets(s, 100, fin);
m=strlen(s);
while(c<6){
fprintf(fout,"Length of %d string: %d\n",c,m);
c++;
}
}
fclose(fin);
fclose(fout);
}
return 0;
}但是length.txt文件中的输出如下所示:
Length of 1 string: 12
Length of 2 string: 12
Length of 3 string: 12
Length of 4 string: 12
Length of 5 string: 12我能得到一些帮助吗,泰
发布于 2021-12-08 10:56:11
考虑一下这个循环
while(c<6){
fprintf(fout,"Length of %d string: %d\n",c,m);
c++;
}它将保持打印和增量c,而不更改仅在外部循环中设置的m值。将while更改为if以修复它,前提是仍然需要限制打印到前5的字符串的数量。(更一般的程序只需读取文件中的任何内容,在这种情况下就不需要条件了。)
(您收到的关于不使用feof作为循环条件的评论仍然有效;也修正了这一点,尽管它与此错误没有直接关系。)
发布于 2021-12-08 10:57:42
目前还不清楚你想用这个内环实现什么。
while(c<6){
fprintf(fout,"Length of %d string: %d\n",c,m);
c++;
}它将打印6次相同字符串的长度。
在读取输入行的外部循环的下一个周期中,c的值将已经是6,因此对于第2行或更高版本的输入行,不会再次调用内环。
移除内循环将解决问题。
while(!feof(fin)){
fgets(s, 100, fin);
m=strlen(s);
fprintf(fout,"Length of %d string: %d\n",c,m);
c++;
}除了这个,像这样的循环
while(!feof(fin)){
/* ... */
}总是错误的,因为feof会告诉您,在做了一些输入操作之后,是否到达了EOF。
正如在comment中已经提到的,正确的循环实现是
while(fgets(s, sizeof s, fin)) {
m=strlen(s);
fprintf(fout,"Length of %d string: %d\n",c,m);
c++;
}https://stackoverflow.com/questions/70273687
复制相似问题