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