在理解sscanf字符串格式时,我有点问题。C sscanf和字符串格式
我已经存储在STR该字符串:192.168.0.100/act?bla=
我想这段代码有BLA存储在我的“关键”变量,其余的东西(在“=”)在我的“ BUF”变量
char str[] = "192.168.0.100/act?bla=";
char key[20];
char buf[100];
sscanf(str, "%*[^?] %[^=] %s", key, buf);
在理解sscanf字符串格式时,我有点问题。C sscanf和字符串格式
我已经存储在STR该字符串:192.168.0.100/act?bla=
我想这段代码有BLA存储在我的“关键”变量,其余的东西(在“=”)在我的“ BUF”变量
char str[] = "192.168.0.100/act?bla=";
char key[20];
char buf[100];
sscanf(str, "%*[^?] %[^=] %s", key, buf);
的?
和=
不会消耗那么它们包括在格式说明:
sscanf(str, "%*[^?]?%[^=]=%s", key, buf);
请参阅演示http://ideone.com/YoRMh3。
为了防止缓冲器溢出指定可以由每个指定符被读取的字符,比目标阵列的一个更小的最大数量,以允许空终止,并确保通过检查sscanf()
的返回值,该值被填充两个阵列:
if (2 == sscanf(str, "%*[^?]?%19[^=]=%99s", key, buf))
{
printf("<%s>\n", key);
printf("<%s>\n", buf);
}
为了确保buf
值不会被截断,您可以使用%n
格式说明填充的int
表明在该处理停止的位置(注意%n
对的sscanf()
的返回值没有影响) 。如果整个输入被处理的结束位置strlen(str)
:
int pos;
if (2 == sscanf(str, "%*[^?]?%19[^=]=%5s%n", key, buf, &pos) &&
strlen(str) == pos)
{
printf("<%s>\n", key);
printf("<%s>\n", buf);
}
您可以添加exptected字符,以便它们将被读取并忽略:“?”
sscanf(str, "%*[^?]?%[^=]=%s", key, buf);
注意和'='仍然在流中,并且在处理完[^=]
后不会被读取。
@GrijeshChauhan,你是不是指'snprintf'? – StoryTeller
@StoryTeller阿哈!是的,你是正确的......没有什么是'snscanf' –