gpt4 book ai didi

C while 循环 feof

转载 作者:行者123 更新时间:2023-11-30 15:51:14 25 4
gpt4 key购买 nike

这是一个更大的电影 Sprite 程序的一部分,由于某种原因,程序在到达这个 while 循环时崩溃了,我不明白我的问题是什么。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>

FILE *fp, *fopen();
char *arrayoffilms[45];
int main()
{
char line[100],junk[100];
fp=fopen("filmtitles.txt","r");
int i=0;
while(!feof(fp)) {
fscanf(fp,"%[^\n]s",line);
strcpy(arrayoffilms[i],line);
fscanf(fp,"%[\n]s",junk);
i++;
}
fclose(fp);
printf("%s\n\n\n",arrayoffilms[i]);
return 0;
}

最佳答案

feof 在进行实际读取尝试并且达到 EOF 之前永远不会返回 true。读取尝试通常具有指示失败的返回值。为什么不使用那些呢?

不要混淆 %[%s 格式说明符; %[ 未提供 %s 的扫描集; %[^\n]s 告诉 scanf 读取“一个或多个非 '\n' 字符,后跟一个 's' 字符”。那有意义吗?仔细想想,仔细想想。这个格式说明符的目的是什么?如果用户仅按 Enter 键,而 scanf 没有得到“一个或多个非 '\n' 字符”,会发生什么情况?在查找非“\n”字符之前,删除所有“\n”字符非常重要。格式字符串中的任何空白字节都会导致 scanf 消耗尽可能多的空白,直到第一个非空白字符。我假设您想要 %[^\n],甚至可能 %99[^\n],这样可以防止行溢出。

也许您还想计算 scanf 处理的字节数,这样您就可以 malloc 正确的长度并复制到 arrayoffilms 中,出于某种我无法想象的原因。您可以使用 %n 格式说明符,它会告诉您 scanf 处理了多少字节。

我注意到您想要读取并丢弃一行的其余部分。在我的示例中,只有在遇到换行符之前读取了 99 个字符,才会丢弃该行的其余部分。我将使用赋值抑制“*”:%*[^\n]

组合这些格式说明符会产生一个格式字符串“%99[^\n]%n%*[^\n]”,两个参数(一个 char *(对于 %[)和 int *(对于 %n),预期返回值为 1(因为正在分配 1 个输入) 。当返回值不为1时,循环将结束,这可能是由诸如“reading Beyond eof”之类的错误引起的。

int length;
while (fscanf(fp, " %99[^\n]%n%*[^\n]", line, &length) == 1) {
arrayoffilms[i] = malloc(length + 1);
strcpy(arrayoffilms[i], line);
i++;
}

关于C while 循环 feof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15282790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com