C sscanf和字符串格式

时间:2013-01-10 11:52:54

标签: c string format scanf

在理解sscanf字符串格式时我遇到了一些问题。

我将该字符串存储在 str 192.168.0.100/act?bla=

我想用这段代码将 bla 存储在我的“key”变量中,剩下的东西(在'='之后)存储在我的“buf”变量中

char str[] = "192.168.0.100/act?bla=";
char key[20];
char buf[100];
sscanf(str, "%*[^?] %[^=] %s", key, buf);

2 个答案:

答案 0 :(得分:7)

不会消耗?=,因此请将它们包含在格式说明符中:

sscanf(str, "%*[^?]?%[^=]=%s", key, buf);

请参阅http://ideone.com/YoRMh3上的演示。

要防止缓冲区溢出,请指定每个说明符可以读取的最大字符数,比允许空终止的目标数组少一个,并通过检查{{1}的返回值来确保填充这两个数组}:

sscanf()

为了确保if (2 == sscanf(str, "%*[^?]?%19[^=]=%99s", key, buf)) { printf("<%s>\n", key); printf("<%s>\n", buf); } 值不被截断,您可以使用填充buf的{​​{1}}格式说明符来指示处理停止的位置(请注意{{ 1}}对%n)的返回值没有影响。如果处理了整个输入,则结束位置为int

%n

答案 1 :(得分:1)

您可以添加预期的字符,以便读取和忽略它们:

sscanf(str, "%*[^?]?%[^=]=%s", key, buf);

请注意'?'并且'='仍然在流中,并且在处理[^=]后不会被读取。