带有“_”分隔符的sscanf

我在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”。

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

应该

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

请注意,您要使用而不是_来分隔占位符。

见http://ideone.com/8zBmG 。

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

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

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

 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); } 

它看起来像你在sscanf字符串中包含了逗号(,)。

但是你的输入中没有逗号。 没有任何逗号可以处理, sscanf在第一个字符串"This"之后失败

我建议尝试格式字符串:

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