【问题标题】:c file all i'm getting is an infinite loopc文件我得到的只是一个无限循环
【发布时间】:2013-03-23 00:34:59
【问题描述】:

谁能帮助我完成以下 c 程序?这只是我在 c 中的第二个程序,所以我不知道我在做什么。

我正在尝试用 c 创建一个程序来读取文件“input.txt”并根据学生正确答案的百分比以星号给出学生的数学分数

我想出的只是一个无限循环 的

+:*

-:*

*:*

/:*

input.txt 类似于下面


1 学生人数

卡拉学生姓名

8 10 加分由 8/10 决定

50 80 减法分数由 50/80 决定

30 60 乘法分数由 30/60 决定

2 5 由2/5决定的分区分数


具有所需的输出

卡拉

+: * * * * * * * *

-: * * * * * *

*: * * * * *

/: * * * *


我的代码

int num; 
char name; 
int sum;
int cur;
int i;
int avg; 

//call file
FILE*ifp=fopen("input.txt","r");
fscanf(ifp,"%d",&num);
for (i=0;i=num;i++){
        fscanf(ifp,"%c",&name);
        printf("%c",&name);
        for(sum=0;sum<=4;sum++){
            fscanf(ifp,"%d",&cur);
            scanf(cur,"%d %d")
            avg=%d/%d;
            if (sum==1)
                printf("+:");
            else if (sum==2)
                printf("-:");
            else if (sum==3)
                printf("*:");
            else if (sum==4)
                printf("/:");
            if (avg==1)
                printf("**********\n");
            else if (avg>=.9)
                printf("*********\n");
            else if (avg>=.8)
                printf("********\n");
            else if (avg>=.7)
                printf("*******\n");
            else if (avg>=.6)
                printf("******\n");
            else if (avg>=.5)
                printf("*****\n");
            else if (avg>=.4)
                printf("****\n");
            else if (avg>=.3)
                printf("***\n");
            else if (avg>=.2)
                printf("**\n");
            else if (avg>=.1)
                printf("*\n");
            else
                printf("\n");
        }
}
//close file
fclose(ifp);
return 0;

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 你试过在调试器中运行这个吗?
  • 更好地使用 1) ++i 而不是 i++ 2) 1 == sum 而不是 sum == 1

标签: c file file-io io


【解决方案1】:

你的无限循环是因为你的外循环有条件: 将for (i=0;i=num;i++) 更改为for (i=0;i&lt;num;i++)

实际上,您每次只是将 i 分配给 num,因此是无限循环。

编辑: 我还应该指出,您的行中有语法错误

scanf(cur,"%d %d")
avg=%d/%d;

并且您的avg 变量被声明为int,因此您将执行整数除法,这可能不会像您预期的那样运行;也就是说,您只会得到整数,因此您随后的条件将在很大程度上毫无意义。你应该把它变成一个浮点数或双精度数,并将你的一个操作数转换为浮点数

【讨论】:

  • 我觉得肯定有i &lt; num :)
  • 可能i &lt; num更合适。
  • 对于我需要做的事情,我将其更改为 '(i=0;i
  • 是你正在运行的代码吗?就目前而言,它不会编译,因为你的行 scanf(cur,"%d %d") avg=%d/%d;我建议把你正在运行的实际代码放在上面,这样我们就可以深入了解细节
【解决方案2】:

考虑以下 For 循环:

for(i = 0, i < 10; i++)
{
   DoSomething();
}

这个执行的顺序是:

  • 运行 i = 0;
  • 运行 i
  • 运行 DoSomething();
  • 运行 i++
  • 返回“运行 i

在您的情况下,您实际上是在将 num 分配给 i,而不是检查 i 是否等于 num。因为 C 将 0 视为“假”,而将其他任何内容视为“真”,并且因为 i = 10 的“结果”是 10(参见边栏 1),计算机将 i = 10 评估为“真”,所以循环继续进行

在 C 语言中这是一个很容易犯的错误,因为编译器不会警告你。像 Lint 这样的静态分析工具可以,但那是另一回事了。

在结论中,您可能希望 "i = num" 成为 "i

Sidebar1 此属性允许您像 a = b = c = 10 一样链接分配。c = 10 的结果是 10,因此被分配给 b。 b = 10 的结果是 10,因此被分配给 a。

【讨论】:

    猜你喜欢
    • 2013-11-28
    • 2020-04-28
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多