C fscanf输入验证

时间:2016-04-28 17:19:48

标签: c struct

我正在使用带有fscanf的for循环将一个文件中的5列输入到structs数组中。每个struct有5个变量:1个字符串和4个int,第一个fscanf读取字符串名称并将其存储为a的一部分将其他4个输入整数构造成所述结构(全部到结构的不同变量)。正常输入它工作正常。但是当一个字符输入到整数列中的一个时,scanf为其中的0和该结构的其余值放置并使用char,好像它是一个新结构,即它跳过它之后的所有内容并使用不需要的char作为名称将行的其余值作为输入。 我的问题是,是否有一种方法可以忽略该输入生成的不需要的结构,或者只是简单地防止识别出char并且特定的scanf被滑落? 我已经尝试使用fgets而不是扫描,但它不起作用,我也不能使用0来排序不需要的值,因为0可以作为正常值输入。 我理解,理想情况下看一下代码会有所帮助,但我不愿意为了plaigirism的原因发布它,因为这是针对大学的,我不喜欢那些plaigirism会议。 如果问题没有得到很好的解释,请提前致谢并对不起。 :)

3 个答案:

答案 0 :(得分:1)

您需要检查fscanf()的返回值以确保它成功,如果失败则不会修改超出失败的说明符的参数

char name[100];
int value1;
int value2;
int value3;
int value4;

if (fscanf(file, "%99s%d%d%d%d", name, &value1, &value2, &value3, &value4) == 5)
    success();
else
    failure();

当然,由success()failure()实际执行的操作取决于您,但这样可以防止未定义的行为。

答案 1 :(得分:1)

键是“输入5列”,表示文本的。使用fscanf()很难与同步,特别是如果您想以其他方式解释文本。最好单独处理阅读和解析。

char buf[100];
while (fgets(buf, sizeof buf, istream)) {
  char s[sizeof buf];
  s[0] = 0;
  int i[4] = { 0,0,0,0 }; // default values

  // c is the count of scanned variables
  int c = sscanf(buf, "%s%d%d%d%d", s, &i[0], &i[1], &i[2], &i[3]);

  printf("%d: %s %d %d %d %d\n", c, s, i[0], i[1], i[2], i[3]); 
}

“但是当一个字符输入其中一个整数列时,scanf将其设为0”可能是假的。您看到的是之前的值。

答案 2 :(得分:0)

简短的回答是,fscanf是这项工作的错误工具。

我猜这是你想要阅读的那种文件:

abc 1  2  3  4
def 5  6  7  8
ghi 9 10 11 12

因此,即使您使用fscanf获取完美代码来读取此数据,由于fscanf的工作方式,您的代码也会非常愉快地阅读这些垃圾般的外观文件,创建相同的三个记录:

abc 1  2  3   4 def
5   6  7  8 ghi 9
10 11 12

阅读格式化文本行的更好方法是使用fgets一次读取一行,然后将每一行分解为其字段。

我,我总是使用一个名为getargs的函数,该函数在argcargv中将一行划分为以空格分隔的“单词”,就像main()收到的一样。遗憾的是getargs不是标准的。但是你可以使用these class notes中描述的版本。

您可以使用标准库函数strtok执行大致相同的操作。 (不幸的是我无法告诉你如何去做,因为我从不使用strtok。)

最后,您可以使用sscanf,正如chux已经建议的那样。你说你试过这个并且它“没​​有用”,但是如果你给我们一些更多的细节,我们或许可以帮助你让它运作起来。