【问题标题】:sscanf with "_" delimiter in CC中带有“_”分隔符的sscanf
【发布时间】:2011-11-15 18:27:17
【问题描述】:

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

【问题讨论】:

  • 离题但%[^'_'] 看起来像一个可爱的发条机器人脸!你有四个组装成一条线。

标签: c


【解决方案1】:
sscanf(test,"%[^'_'],%[^'_'],%[^'_'],%[^'_'],%s",tmp1,tmp2,tmp3,tmp4,tmp5);

应该是

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

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

http://ideone.com/8zBmG

此外,您不需要's,除非您也想跳过单引号。

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

【讨论】:

  • 不应该所有的说明符都以s结尾吗?
  • @cnicutar: No.
  • +1,但数组长度最好是安全的,我会测试返回值:if (sscanf(test, "%9[^_]_%9[^_]_%9[^_]_%9[^_]_%9s", tmp1, tmp2, tmp3, tmp4, tmp5) != 5) /* handle error */;
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在我看来,您的 sscanf 字符串中包含逗号 (,)。

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

    我建议尝试格式化字符串:

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

    【讨论】:

    • 也没有任何与下划线匹配的东西(很长时间没有使用scanf,但这对我来说看起来很奇怪)。
    • @Kitcha:你真的应该开始接受对你最有帮助的答案。请勾选最适合您的 7 个问题的答案旁边的“复选标记”。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多