C sscanf和字符串格式

Jer*_*ome 0 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);
Run Code Online (Sandbox Code Playgroud)

hmj*_*mjd 7

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

sscanf(str, "%*[^?]?%[^=]=%s", key, buf);
Run Code Online (Sandbox Code Playgroud)

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

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

if (2 == sscanf(str, "%*[^?]?%19[^=]=%99s", key, buf))
{
    printf("<%s>\n", key);
    printf("<%s>\n", buf);
}
Run Code Online (Sandbox Code Playgroud)

为了确保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);
}
Run Code Online (Sandbox Code Playgroud)

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