sscanf格式故障避免:

时间:2016-03-05 17:45:22

标签: c formatting scanf

我必须用以下格式分割(使用sscanf是或是)一个字符*:

First_Line1: This is the 1st line 要么 First_Line: This-is_the_first-line123

我只需要将内容放在2个变量中,其中一个包含在"之前的内容:"和#34;之后的另一个内容:"。

请注意":"之前和之后可能有数字和特殊字符。

我到目前为止尝试过的一些例子是:

sscanf(cab, "%[a-zA-Z]%*[:] %[a-zA-Z]", &cab.name, &cab.value);
sscanf(cab, "%s %*[:] %s", &cab.name, &cab.value);

还有很多我无法记住的事情。 (实际上我并不关心特殊字符,只想把它分成两部分)

我无法使用任何格式参数使其正常工作。请帮忙。感谢。

1 个答案:

答案 0 :(得分:1)

我之前从未使用过这种格式,但我很快就解决了这个问题:

#include <stdio.h>

int main(void)
{
    char inp [] = "one two: three four";
    char str1[100] = "";
    char sep = ' ';
    char str2[100] = "";

    if (sscanf(inp, "%[^:]%c %[^\0]", str1, &sep, str2) != 3)
        return 1;

    printf("'%s'\n", str1);
    printf("'%s'\n", str2);
    return 0;
}

程序输出(添加'以清楚地显示字符串的范围):

'one two'
'three four'

请注意您的一个特定错误:&cab.name等不应该有&,因为您提供的值将是指针或衰减指针。

修改

正如@ user3121023所指出的(自删除后的评论),格式%[^\0]将提前终止格式字符串。所以我建议在输入数据中使用不出现的字符。由于从未找到过,所以输入的其余部分都将被采用。

if (sscanf(inp, "%[^:]%c %[^\7]", str1, &sep, str2) != 3)
    return 1;