【问题标题】:Using sscanf to parse a string使用 sscanf 解析字符串
【发布时间】:2012-01-04 07:06:12
【问题描述】:

在 C89 模式下使用 gcc (GCC) 4.6.2。

我想知道我的sscanf 是否已正确实施?

我试图只从包含在元素中的这个 SDP 字符串中获取端口号,端口号是“49462”。

m=audio 49462 RTP/AVP 0 8

我正在像这样使用sscanf:

sscanf(element, "%*s %d", &sdp.audio_port);

所以它会忽略第一个字符串部分 'm=audio' 然后获取端口号,这正是我想要的。

端口号后面的字符串的最后部分可以忽略。事实上,可以指定更多的音频格式,即 0 8 94 101 等。因此可以验证字符串长度。不过,这只是我感兴趣的音频端口而已。

我需要为字符串的其余部分指定任何格式吗?

我遇到了一些内存问题,想知道这是否是原因。

【问题讨论】:

  • 需要注意的一点是,如果sscanf 看到一个整数文字,其值不适合int,那么它的行为是未定义的。这意味着没有可移植的方法来检测或处理此类错误。如果您在致电sscanf() 之前确定这不会成为问题,您可以使用它;否则,您将不得不推出自己的解析器,可能使用strtol()。

标签: c scanf


【解决方案1】:

我在 Codepad.org 上运行了以下代码,它运行良好。

#include<stdio.h>

int main()
{
char *element= "m=audio 49462 RTP/AVP 0 8";

int num;
sscanf(element, "%*s %d", &num);

printf("%d\n",num);
return 0;
}

可能正如您所描述的,在其他地方有一个 Run Time Error 阻止了有效代码-sn-p 的预期输出。

【讨论】:

    【解决方案2】:

    你写的看起来不错。无需指定您未解析的字符串部分中的内容。当然,您应该检查来自sscanf() 的返回值,以确保您确实成功转换了一个值:

    if (sscanf(element, "%*s %d", &sdp.audioport) != 1)
        ...process error...
    else
        ...use sdp.audioport...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2021-11-18
      相关资源
      最近更新 更多