gpt4 book ai didi

c - (读取 CSV 文件)scanf 在模式不匹配后跳到下一行输入

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

如果 scanf 遇到不匹配,我想给出一条错误消息,然后继续读取其余的输入。如果其中一个输入格式不正确,我当前的代码将进入无限循环。

预期输入:

101,Betty,Hay,123 Main St.,23
234,Sheila,Benn,937 Ash Ave.,46
384,Ron,Jewell,3991 Cedar Ave.,30
291,Bill,Read,83 Crescent St.,19
103,Alexander,Ott,100 2nd St.,21
115,Tricia,Munson,585 Oxen Ave.,28
118,Sam,Munson,585 Oxen Ave.,35
110,Valerie,Parker,1513 Copper Rd.,37

代码:

#include <stdio.h>

int main()
{
int sum = 0;
int count = 0;
while (1)
{
int id;
char first[80], last[80], addr[80];
int age;
scanf("%d,%80[^,],%80[^,],%80[^,],%d", &id, first, last, addr, &age);
if (feof(stdin)) break;
printf("id=%d first=%s last=%s addr=%s age=%d\n",
id, first, last, addr, age);
sum += age;
count++;
}

printf("Average age is %f\n", (float)sum / count);

return 0;
}

我试图通过将 scanf 放入 if 语句中来解决此问题,将其与预期的读取次数进行比较,这可以显示错误消息,但无助于读取其余输入。有没有办法跳到下一行输入?

最佳答案

您需要直接测试scanf() 的结果。在这种情况下(以及大多数其他情况下),我建议使用 fgets()sscanf() 而不是普通的 scanf()

#include <stdio.h>

int main(void)
{
int sum = 0;
int count = 0;
int lineno = 0;
char line[4096];
while (fgets(line, sizeof(line), stdin) != 0)
{
int id;
char first[80], last[80], addr[80];
int age;
lineno++;
if (sscanf(line, "%d,%79[^,],%79[^,],%79[^,],%d", &id, first, last, addr, &age) != 5)
fprintf(stderr, "Invalid data in line %d:\n%s", lineno, line);
else
{
printf("id=%d first=%s last=%s addr=%s age=%d\n",
id, first, last, addr, age);
sum += age;
count++;
}
}

printf("Average age is %f\n", (float)sum / count);

return 0;
}

其中的修复包括:

  1. 直接检查输入函数 (fgets()) — 使用 feof() 通常是不合适的。
  2. 检查 sscanf() 调用是否找到了 5 个值。
  3. 确保字符串不会溢出分配的缓冲区; sscanf() 等人需要一个不包括末尾空字节的大小——因此格式从 80 变为 79。
  4. 能够报告有缺陷的整行,因为它已全部读入。使用 scanf() 相反,它截断了行的不确定的初始部分,谁知道还剩下什么报告错误。在这里,你得到了整行并且可以更有意义地报告错误。我包含了一个行号以进一步改进。

关于c - (读取 CSV 文件)scanf 在模式不匹配后跳到下一行输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18863206/

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