在C中翻译sscanf()引用

时间:2017-08-01 15:10:59

标签: c scanf

我有这段代码:

sscanf ("45 , ignore_this % C read_in_this**", "%d , %*s %% %c %5s %s",
&i, &c, string, &string[5]);

当我查看变量赋值时,我得到了

c = C
i = 45
string = read_in_this**
string + 5 = in_this**

我对如何分配&i&cstring&string[5]感到困惑。我的逐步解释/问题:

  • &i - > %d - > “45”
  • 由于“*”而跳过
  • %*s,因此忽略“ignore_this”。
  • 是否也跳过了%%?为什么&c没有分配到%%?输入字符串中的“%”会发生什么?
  • &c - > %c - > “C”
  • string - > %5s - > “read_in_this **”但是'5'的重点是什么?为什么它不能只是%s
  • 不确定&string[5]的作用。

  • string + 5到底做了什么?

真的很感激帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

*scanf中,空白字符占用所有空格,%启动转换说明符。格式中的其他字符必须与输入1对1匹配。 %%与输入中的%匹配。

因此:

  • %d从输入(45)转换十进制整数,并将其存储到i
  • 吃空格
  • %*s解析并丢弃由空格分隔的字符串(ignore_this
  • ,与逗号匹配
  • 吃空格
  • %c读取一个字符,将其存储到char - 此处'C',存储到c
  • 再次吃白色空间

现在此时剩余的输入为read_in_this**。转换说明符%5s解析最多5个字符长的空格分隔字符串 - 这里它将匹配read_;这些字符将存储在string[0] ... string[4]; string[5]将收到字符串终止\0。剩下的输入是in_this**。现在将丢弃任何空格(没有任何空格,因此不会丢弃任何空格)。

最后,最后一个%s将以空格分隔的字符串in_this_**读取,并将其存储到从<{1}}的地址启动的内存中 - 即用string[5]覆盖终止空字符 - 依此类推。您可以试验如果将i替换为&string[5],将会发生什么。