带有“_”分隔符的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"