2012-11-21 10 views
25

私は、文字列(char*)を解析していると私はそうのように、ダブルスに文字列から数字を解析するsscanfを使用しています:sscanfが読み取る文字数を取得しますか?

// char* expression; 
double value = 0; 
sscanf(expression, "%lf", &value); 

これは素晴らしい作品が、私は、その後の解析続けていきたいと考えて従来の方法で文字列に変換します。私はsscanfによっていくつの文字が解析されたかを知る必要があるので、新しいオフセットからマニュアル解析を再開することができます。

明らかに、最も簡単な方法は、何らかの形で文字sscanf解析数を計算することであろうが、それを行うための簡単な方法はありません場合、私は代替ダブル解析オプションにオープンています。しかし、私は現在、sscanfを使用しています。なぜなら、高速でシンプルで読みやすいからです。いずれにせよ、私はダブルを評価し、それの後でパースを続ける方法が必要です。

答えて

39

あなたは書式指定子%nを使用してsscanf()に追加int *引数を提供することができます:C99標準から書式指定nため

int pos; 
sscanf(expression, "%lf%n", &value, &pos); 

説明:

んが、入力が消費されません。 対応する引数は 符号付き整数へのポインタで、これはfscanf関数の呼び出しによって今までのところ入力ストリームから読み取られた文字数に書き込まれます。 %nディレクティブを実行しても、fscanf関数の実行完了時に返された割り当てカウントはインクリメントされません。引数は変換されませんが、1つは消費されます。変換指定に割り当て抑制文字またはフィールド幅が含まれる場合、その動作は未定義です。

常に割り当てが行われたことを確認するためにsscanf()の戻り値をチェックし、その後のコードは、値が変化しなかったではない誤ったプロセス変数を行います。

/* Number of assignments made is returned, 
    which in this case must be 1. */ 
if (1 == sscanf(expression, "%lf%n", &value, &pos)) 
{ 
    /* Use 'value' and 'pos'. */ 
} 
+0

私は[Microsoft実装](https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f=255&MSPPError=-2147217396)のように動作しないようです: '' sscanf_s(p、 "%s%d \ n%n"、toString、(int)_countof(toString)、&itemCount、&pos); '' pos'は全く変更されていないようです。 – c00000fd

2
int i, j, k; 
char s[20]; 

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3) 
    ...something went wrong... 

変数kは文字カウントが含まれていますがjに格納されている整数の終わりがスキャンされたポイントまで。

%nは成功したコンバージョンにはカウントされません。必要であれば、フォーマット文字列に%nを何度も使用することができます。

関連する問題