gpt4 book ai didi

c - while 循环依赖于 scanf 结果过早结束

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:45 25 4
gpt4 key购买 nike

我正在用 C 编写一个简单的程序来计算成绩和平均成绩。我通过“< xyz.txt”从命令行为它提供一个文本文件,并通过“> xyz_output.txt”命令输出到另一个文本。输入文件中有超过 100 行数据,但程序出于某种原因一直在输入的第 6 行周围退出循环......我已经检查了几次输入格式,但我似乎无法弄清楚为什么它过早退出。这是代码:

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

int main()
{
char pp[4];
char school[3];
int class;
int student;
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int i;
int j;
int k;
int l;
int m;
int n;
int o;
int p;
int q;
int r;
float average;
int runtotal;
int grouptotal = 0;
float groupaverage;
int counter = 0;
while (scanf("%3s%2s%2i%2i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i", pp, school, &class, &student, &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l, &m, &n, &o, &p, &q, &r) == 22)
{
runtotal = (a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r);
average = (float)runtotal / 18;
grouptotal = grouptotal + runtotal;
counter++;
printf ("%i.\n", counter);
printf ("%s%s-%i-%i -- %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i %1i\n", pp, school, class, student, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r);
printf ("Total score: %i\n", runtotal);
printf ("Average: %f\n", average);
printf ("Running Total: %i\n\n", grouptotal);
}
groupaverage = (float)grouptotal / counter;
printf ("Calculations complete.\nThe total score for this group was %i.\nThe average score for this group was %f.\n", grouptotal, groupaverage);
return 0;
}

这里是实际输入的 .txt 文件的前 10 行。

preKO6101 0 0 1 1 1 1 1 0 1 0 1 0 0 1 1 0 2 0
preHI6114 1 0 0 1 0 1 1 1 1 0 0 0 0 1 1 1 2 1
preHI5116 0 0 0 1 0 0 1 1 1 0 0 0 0 2 0 0 1 0
preHI6103 0 0 0 1 0 0 1 1 1 0 0 0 0 1 1 0 0 1
preHI5132 0 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 0
preHI5109 1 0 0 1 1 0 0 1 0 0 0 0 1 1 1 2 2 1
preHI6113 2 1 1 1 1 0 1 0 0 0 1 0 1 1 1 0 0 1
preSA5116 0 1 0 1 1 2 1 2 0 0 0 0 2 1 2 0 2 2
preHI6109 0 0 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1
preHI5107 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 1 0

它似乎进入“preHI5109”但随后退出。我觉得这与我使用 scanf 的方式有关,但我不确定我做错了什么。有关如何解决此问题的任何建议?

最佳答案

用于读取数据文件的方法对未对齐、解析和 I/O 问题非常敏感。建议更强大的 IO 和解析,因为数据文件中肯定存在一些小错误。使用 fgets() 控制读取面向行的数据。

char buf[100];
while (fgets(buf, sizeof buf, stdin) != NULL) {
int count = sscanf(buf, "%3s%2s%2i%2i %i %i %i %i /* ... */ %i %i",
pp, school, &class, &student, &a, &b, &c, /* ... */ &q, &r);
if (count != 22) {
printf("Error %d (TBD relevant text)\n", count);
break;
}
/* continue with normal processing */
}

其他改进
int a[18] 而不是 int a;诠释乙; ...
使用循环然后扫描、求和、打印 18 个元素。
使用 "%i" 而不是 "%1i"1最小宽度,为什么要有它?

注意:如果输入文件是由教授提供的,我不会对其中有故意破坏的东西感到惊讶。经验教训:除非经过严格审查,否则不要相信数据输入。用户输入是邪恶的。

关于c - while 循环依赖于 scanf 结果过早结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21075057/

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