C fscanf输入validation

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

您需要检查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 getargs一行划分为以空格分隔的“单词”,就像main()接收一样。 不幸的是, getargs不是标准的。 但是你可以使用这些课堂笔记中描述的版本。

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

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