2012-01-04 10 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); 

だから、最初の文字列の一部「オーディオメートル=」を無視して、私が欲しいものであるポート番号を取得します。

ポート番号の後の文字列の最後の部分は無視できます。実際、0 8 94 101などの指定されたオーディオフォーマットが存在する可能性があります。したがって、文字列の長さが確認できます。しかし、それは私が興味を持っているだけのオーディオポートで、それ以外のものはありません。

文字列の残りの部分に任意の形式を指定する必要がありますか?

メモリの問題が発生しましたが、これが原因である可能性がありますか?

+0

注意すべきことは、 'sscanf'が値が' int'に収まらない整数リテラルを見ると、その動作は未定義です。つまり、このようなエラーを検出または処理する移植可能な方法はありません。あなたが 'sscanf()'を呼び出す前にこれが問題ではないことが確かであれば、それを使うことができます。それ以外の場合は、おそらく 'strtol()'を使って独自のパーサをロールバックする必要があります。 –

答えて

3

を私はCodepad.orgに次のコードを実行し、それがうまく働いた:あなたは、もちろん、あなたが実際に一つの値が正常に変換しまったことを確実にするためにsscanf()からの戻り値をチェックする必要があります。

#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

あなたが書いたことは上手く見えます。あなたが解析していない文字列の部分に何があるかを指定する必要はありません。

if (sscanf(element, "%*s %d", &sdp.audioport) != 1) 
    ...process error... 
else 
    ...use sdp.audioport... 
関連する問題