2012-01-04 81 views
3

在C89模式下使用gcc(GCC)4.6.2。使用sscanf解析字符串

我想知道如果我sscanf已正确实施?

我想先手刚刚从它包含在这个元素SDP字符串的端口号,端口号为“49462”。

m=audio 49462 RTP/AVP 0 8 

我使用sscanf这样的:

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

所以它会忽略第一个字符串的一部分“M =音频”,然后得到的端口号,这是我想要的。

端口号后面字符串的最后部分可以忽略。实际上可以有更多的音频格式,即0 8 94 101等,所以字符串长度可以验证。但是,这只是我感兴趣的音频端口,没有别的。

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

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

+0

有一点要注意的是,如果'sscanf'看到一个整数文字,其值不适合在'int',其行为是不确定的。这意味着没有便捷的方式来检测或处理这样的错误。如果您在调用'sscanf()'之前确定这不会成为问题,那么您可以使用它;否则,你将不得不推出自己的解析器,可能使用'strtol()'。 – 2012-01-06 07:43:13

回答

3

我跑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别处防止预期的输出。

3

你写的看起来很好。没有必要指定不解析的字符串部分。你应该,当然,从sscanf()检查返回值,以确保你实际上得到一个值成功转换:

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