c中的fscanf用法

时间:2012-03-09 17:10:07

标签: c scanf

我有一个这样的文件:

10 15
something

我想把它读成树变量,比如说number1,number2和mystring。我怀疑fscanf会给出什么样的模式。我在想这样的事情;

fscanf(fp,"%i %i\n%s",number1,number2,mystring);

这是否有效,而且,这是读取此文件的正确方法吗?如果没有,你会建议什么?

3 个答案:

答案 0 :(得分:2)

fscanf(fp,"%i %i\n%s",&number1,&number2,mystring);

fscanf需要指点。

答案 1 :(得分:1)

使用fgets(或getline,如果有的话)阅读每一行,将行分为strsep(更好,如果可用)或strtok_r(更尴尬) API但更便携),然后根据需要使用strtoul将字符串转换为数字。

永远不要使用

*scanf,因为:

  1. 某些格式字符串(例如裸"%s")与gets一样急于溢出缓冲区。
  2. 整数溢出的行为未定义 - 无效的输入可能会导致程序崩溃。
  3. 它们不会报告第一个扫描错误的字符位置,因此几乎不可能从解析错误中恢复。 (使用fgets然后使用sscanf代替fscanf可以稍微减轻这种情况。)

答案 2 :(得分:0)

除了指针问题之外,通常在scanf格式中使用空格是一个错误 - 在大多数情况下,scanf会自动跳过空格。所以我会使用类似的东西:

int number1, number2;
char mystring[32];
fscanf("%i%i%31s", &number1, &number2, &mystring)

这将读取两个数字,后跟一个最多31个非空白字符的字符串,全部由任何空格分隔。请注意,“空白”包括空格,制表符和换行符,因此如果它全部在一行上,或者分散在3行或其间的任何内容中都无关紧要。

另请注意,使用字符串大小的限制 - 如果不是这样,输入可能会溢出您提供的任何固定大小的缓冲区(并且无法使用scanf提供可变大小的缓冲区)