2013-01-10 47 views
0

在理解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); 
+0

@GrijeshChauhan,你是不是指'snprintf'? – StoryTeller

+0

@StoryTeller阿哈!是的,你是正确的......没有什么是'snscanf' –

回答

7

?=不会消耗那么它们包括在格式说明:

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); 
} 
+4

+1你还应该限制读取字符的数量以避免数组溢出: 'sscanf(str,“%* [^?]?%20 [^ =] =%100s“,key,buf);' –

+0

@AdriánLópez,是的。刚刚发生在我身上但尚未更新。谢谢。 – hmjd

+0

Thx很多为您的快速和准确的答案! :) – Jerome

1

您可以添加exptected字符,以便它们将被读取并忽略:“?”

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

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