2016-03-05 43 views
-3

我有分裂(与sscanf的回答是或者)一个char *这种格式:sscanf的格式的麻烦,避免:

First_Line1: This is the 1st lineFirst_Line: This-is_the_first-line123

我只是需要把内容在两个变量中,一个包含“:”之前的内容,另一个包含“:”之后的内容。

请注意,在“:”之前和之后可能会有数字和特殊字符。

到目前为止,我已经尝试了一些例子:

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

和很多我不记得了。 (我实际上并不关心特殊字符,只是想将它分成两部分)

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

+1

请显示您尝试过的代码,然后我们会建议如何更改它。人们不希望被期望写出整个事情。 – BoBTFish

+1

考虑在整行上使用'strtok'。 –

+0

对不起,现在就做。我尝试过很多格式,我甚至都不记得所有的格式。 – dunnomuch

回答

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; 
+0

它的工作,非常感谢你 – dunnomuch

+0

@ user3121023感谢您的评论,请参阅我的**编辑**。 –