【问题标题】:C sscanf Need help understandingC sscanf 需要帮助理解
【发布时间】:2014-11-25 15:04:22
【问题描述】:

我正在尝试学习一些我认为是的 C 语言? 我正在查看 sscanf 的以下代码

sscanf(val1,":%[^ ] %s %s %[^\n]%*[\n\r]%n", val2 , val3 , val4 , val5 ,&n);

但是我在理解它时遇到了很多麻烦,我在网上查看了有关 sscanf 的信息,据我了解,val1 中的 char 数组被分割成 val2、val3、val4、val5 和 &n。但我不太明白这一点:

:%[^ ] %s %s %[^\n]%*[\n\r]%n

我假设字符串会根据 %s 部分被切碎,但其余部分我不太确定,我真的希望有人能给我说一个示例字符串,以及它是如何变成的不同的价值观? 谢谢!!

【问题讨论】:

标签: c scanf


【解决方案1】:

格式字符串解析如下:

:%[^ ] %s %s %[^\n]%*[\n\r]%n
^  ^    ^ ^     ^   ^   ^   ^
|  |    | |     |   |   |   |
|  |    | |     |   |   |   +-- the number of characters read so far
|  |    | |     |   |   +------ \n or \r
|  |    | |     |   +---------- read and ignore this portion of the input
|  |    | |     +-------------- Read string up to \n; should be [^\n\r]
|  |    | +-------------------- Read a string
|  |    +---------------------- Read a string
|  +--------------------------- Read a string up to a space character
+------------------------------ Read a ':' character

如果存在单个空格,则表示需要使用零个或多个空格字符的序列,而不是将其放入任何输出变量中。例如,"%s %s" 应用于"hello world" 字符串会将"hello" 放入第一个字符串,将"world" 放入第二个字符串,并忽略分隔这两个字符串的空格。

%n 格式在那里,您可以知道该操作从输入中消耗了多少字符。这通常用于调整循环中下一次读取的位置,并确定循环是继续还是终止。

注意:使用%s 是不安全的,因为输入足够长的字符序列会导致缓冲区溢出。当您将字符串读入长度为N 的缓冲区时,您应该将N-1 的大小放在%s 之间。例如,如果您将字符串读入大小为 32 的缓冲区,请按如下方式更改格式字符串:

:%31[^ ] %31s %31s %31[^\n]%*[\n\r]%n

这可确保当用户输入超过 31 个字符时不会出现缓冲区溢出。需要为空终止符保留第 32 个字符。

【讨论】:

  • "此时字符串中需要出现一个空格字符" 这并没有削减它。 可选无限序列的空白字符将被匹配。
  • 模式中的空格也可以匹配空序列。
  • 我对这个“一个字符串到一个空格字符”有点困惑,这是否意味着它将把所有内容的字符串值带到下一个空格''?感谢您的回答,非常有帮助且易于理解。
  • @JohnMcKenzie 是的,第一个格式说明符将输入到第一个空格,这将被排除。
  • 谢谢伙计,真的很棒的解释,我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多