2011-11-15 8 views
4

次のコードをCで実行していますが、正解が得られません。Cで "_"区切り文字を使用するsscanf

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

私が手出力は、私は、個々の変数に「これ」「です」「A」「テスト」と「99」をフェッチしなければならないということです何

Temp 1 is This 
Temp 2 is 
Temp 3 is 
Temp 4 is 
Temp 5 is 

です。

+0

Offtopicしかし%の[ '_' ^] 'かわいい時計仕掛けのロボットの顔のように見えましたの!そしてあなたはそれらのうちの4つを一列に集めました。 – syockit

答えて

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

あなたが分離されている

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

注意する必要があります:処理するために、任意のカンマがなければ、sscanfは、最初の文字列の後に"This"

を失敗している私は、書式文字列をしようとすることはお勧めします_の代わりに,のプレースホルダを使用します。

http://ideone.com/8zBmGを参照してください。

また、一重引用符もスキップしない限り、'は不要です。

(ところで、あなたはstrtok_rに見てみる必要があります。)

+0

指定子の最後に 's'を付けるべきではないでしょうか? – cnicutar

+1

@cnicutar:[いいえ](http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html)。 – kennytm

+0

それはわかりません:-) – cnicutar

1

sscanf文字列にカンマ(、)を入れているようです。

あなたの入力にカンマはありません。

"%[^_]_%[^_]_%[^_]_%[^_]_%s" 
+0

アンダースコアと一致するものは何もありません(長い間、 'scanf'を使用していませんが、私には奇妙に見えます)。 –

+0

@David:要点。一定。 – abelenky

+0

ありがとうございます。 – Kitcha

3

あなたはあなたの文字列の間commataをスキャンすると、テキスト内のどれもありません。パターンから削除します。

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

アポストロフィもおそらく不要です。何のシェルがそれを拡大するつもりはありませんので、あなたは何を引用する必要はありません。

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); } 
関連する問題