[英]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
的函数,该函数将argc
和argv
的行分成空格分隔的“单词”,就像main()
接收到的那样。 不幸的是, getargs
不是标准的。 但是这些类说明中有一个您可以使用的版本。
您可以使用标准库函数strtok
或多或少地做同一件事。 (不幸的是,因为我从不使用strtok
,所以我无法向您展示如何做。)
最后,您可以使用sscanf
,如chux所建议的那样。 您说您尝试过此方法,但它“行不通”,但是如果您向我们提供更多详细信息,我们也许可以帮助您使其工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.