将sscanf用于未知数量的变量

时间:2018-02-21 17:26:03

标签: c scanf

对于学校作业,我必须读入一个至少包含一个但最多三个变量的字符串(命名为command,one和two)。在字符串的开头总是有一个字符,但它可能会或可能不会跟随整数。格式可以类似于以下任何一种:

i 5 17 
i 3
p
d 4

我正在使用fgets从文件中读取字符串,但是我在处理它时遇到了问题。我一直在尝试使用sscanf,但我得到的段错误是读取一个只有一个或两个变量而不是三个变量的字符串。

  • 我应该使用不同的功能吗?
  • 或者有没有办法格式化sscanf来做我需要的事情?

我已经尝试了sscanf(buffer, "%c %d %d", command, one, two)以及一些没有运气的变种。

1 个答案:

答案 0 :(得分:3)

sscanf可能取决于具体的要求和输入范围。

这里的关键是scanf族函数返回一个有用的值,表示进行了多少次转换。这可能小于零:如果在第一次转换甚至尝试之前发生输入结束或I / O错误,则可以返回值EOF(负值)。

请注意,%c转换说明符不会生成以null结尾的字符串。默认情况下,它只读取一个字符并通过参数指针存储它。 E.g。

char ch;
sscanf("abc", "%c", &ch);

这会将字符'a'写入ch

除非你有一个铁板保证第一个字段总是一个字符宽,否则最好将其作为带%s的字符串读取。始终使用%s的最大宽度不会溢出目标缓冲区。例如:

char field1[64]; /* one larger than field width, for terminating null */
sscanf(..., "%63s", field1, ...);

sscanf不会对整数执行任何溢出检查。如果使用%d来扫描不适合int的大的负值或正值,则根据ISO C,行为很简单。因此,就像使用%s一样,%d最好与字段宽度限制一起使用。例如,%4d用于读取四位数年份。四位小数不会溢出int