繁体   English   中英

C fscanf输入验证

[英]C fscanf input validation

我使用带fscanf的for循环将文件中的5列输入到结构数组中。每个结构都有5个变量:1个字符串和4个整数,第一个fscanf读取一个字符串名称并将其作为结构的一部分存储4个整数输入到struct中(所有都输入到该结构的不同变量中)。 使用普通输入,它可以正常工作。 但是,当一个字符输入到整数列之一时,scanf为此输入0以及该结构的其余值,并像对待新结构一样使用char,即它跳过其后的所有内容并使用不需要的char作为名称以该行的剩余值作为输入。 我的问题是,是否有一种方法可以忽略由该输入生成的不需要的结构,或者有一种简单的方法来防止识别出字符并仅跳过特定的scanf? 我尝试使用fgets代替scan,但是它不起作用,而且由于0可以作为正常值输入,因此我不能使用0来整理不需要的值。 我理解理想情况下查看代码会有所帮助,但出于窃的原因,我不希望将其发布,因为这是针对uni的,而且我不渴望那些those窃的会议。 在此先感谢您,如果问题没有得到很好的解释,对不起。 :)

您需要检查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()实际执行什么操作,但这可以防止未定义的行为。

关键是“输入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可能是错误的。 您看到的是先前的值。

简短的答案是, 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不是标准的。 但是这些类说明中有一个您可以使用的版本。

您可以使用标准库函数strtok或多或少地做同一件事。 (不幸的是,因为我从不使用strtok ,所以我无法向您展示如何做。)

最后,您可以使用sscanf ,如chux所建议的那样。 您说您尝试过此方法,但它“行不通”,但是如果您向我们提供更多详细信息,我们也许可以帮助您使其工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM