繁体   English   中英

C sscanf和字符串格式

[英]C sscanf and string format

在了解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值,该整数值指示处理停止的位置(请注意, %nsscanf()的返回值没有影响)。 如果处理了整个输入,则结束位置为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);
}

您可以添加受保护的字符,以便将其读取和忽略:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM