C sscanf需要帮助理解

时间:2014-09-30 21:04:08

标签: c scanf

我试图学习一些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被切断,部分但其他我不太确定,我真的希望有人可以给我说一个示例字符串,并且如何变成不同的价值观? 谢谢!

1 个答案:

答案 0 :(得分:6)

格式字符串的解析如下:

:%[^ ] %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个字符时没有缓冲区溢出。需要为null终止符保留字符32。