带有“_”分隔符的sscanf

时间:2011-11-15 18:27:18

标签: c

我在C中运行以下代码。我没有得到正确的答案。

int main()
{

    char test[100] = "This_Is_A_Test_99";
    char tmp1[10],tmp2[10],tmp3[10],tmp4[10],tmp5[10];

    sscanf(test,"%[^'_'],%[^'_'],%[^'_'],%[^'_'],%s",tmp1,tmp2,tmp3,tmp4,tmp5);

    printf ("Temp 1 is %s\n",tmp1);
    printf ("Temp 2 is %s\n",tmp2);
    printf ("Temp 3 is %s\n",tmp3);
    printf ("Temp 4 is %s\n",tmp4);
    printf ("Temp 5 is %s\n",tmp5);

    return 0;
}

我得到的输出是

Temp 1 is This
Temp 2 is 
Temp 3 is 
Temp 4 is 
Temp 5 is 

我要做的是在个别变量上取“This”“Is”“A”“Test”和“99”。

3 个答案:

答案 0 :(得分:13)

sscanf(test,"%[^'_'],%[^'_'],%[^'_'],%[^'_'],%s",tmp1,tmp2,tmp3,tmp4,tmp5);

应该是

sscanf(test,"%[^_]_%[^_]_%[^_]_%[^_]_%s",tmp1,tmp2,tmp3,tmp4,tmp5);

请注意,您将占位符与,分开,而不是_

请参阅http://ideone.com/8zBmG

此外,除非您想跳过单引号,否则您不需要'

(顺便说一下,你应该看看strtok_r。)

答案 1 :(得分:5)

您正在扫描字符串之间的逗号,文本中没有。从模式中删除它们:

sscanf(test,"%[^'_']%[^'_']%[^'_']%[^'_']%s",tmp1,tmp2,tmp3,tmp4,tmp5);

撇号可能也是不必要的。你不需要引用任何东西,因为没有shell会扩展它:

sscanf(test,"%[^_]%[^_]%[^_]%[^_]%s",tmp1,tmp2,tmp3,tmp4,tmp5);

接受pmg的建议,你应该将你的临时长度明确地写入scanf参数,以确保你没有得到缓冲区溢出:

sscanf(test,"%9[^_]%9[^_]%9[^_]%9[^_]%9s",tmp1,tmp2,tmp3,tmp4,tmp5);

然后检查返回值:

int token_count = sscanf(test,"%9[^_]%9[^_]%9[^_]%9[^_]%9s",tmp1,tmp2,tmp3,tmp4,tmp5);
if ( token_count != 5 ) { fprintf(stderr, "Something went wrong\n"); exit(42); }

答案 2 :(得分:2)

我觉得你在sscanf字符串中包含了逗号(,)。

但是你的输入中没有逗号。如果没有任何逗号可供处理,sscanf在第一个字符串"This"

之后失败

我建议您尝试使用格式字符串:

"%[^_]_%[^_]_%[^_]_%[^_]_%s"