1

我在理解 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);
4

2 回答 2

8

和不会被使用,因此将它们包含在格式说明符中?=

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);
}
于 2013-01-10T11:59:47.350 回答
1

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

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

注意 '?' 和 '=' 仍在流中,[^=]处理后不被读取。

于 2013-01-10T12:00:21.003 回答