0

この文字列から部分文字列を取得したい:

"1,26,[1076168,'スターベク','ブラン','1.021',10,'08/07/2012 01:00','',0,0,1,6],,[[19, 23,[]],[14148266,[1,0,1,0,5000,-0.50,19001],[-0.95,0.87]],[14166487,[1,0,1,0,2000,-0.25] ,19001],[-0.72,0.64]],[14148270,[5,0,5,0,2000,0.00,19001],[3.90,3.50,1.86]],[14166491,[1,0,1, 0,3000,-0.75,19001],[0.80,-0.88]]],2"

だから私はこのようにswscanf関数を呼び出しました!

swscanf( szTemp , L"%d,%d,[%d,\'%s\',\'%s\',\'%s\',%d,\'%s\',\'\',%d,%d,%d,%d],,[%s],%d" , &n1 , &n2 , &n3 , szA , szB , szT1 , &n4 , szTime , &n5 , &n6 , &n7 , &n8 , szThird , &n9);

結果は次のとおりです。

n1:1  
n2:26  
n3:1076168

szA: Stabaek','Brann','1.021',10,'08/07/2012 (不正解)

szB: ヌル

他のパラメータの値も正しくありません!

なぜこれが起こるのかわかりませんか?

私にその理由を教えてください。

4

1 に答える 1

2

Stabaek格納することが意図されている場合は、フォーマットの区切り文字とは見なされないためszA、除外する必要があります。format の C 標準から:'%ss

非空白文字のシーケンスに一致します。

%sへの変更を除外するには%[^']:

swscanf( szTemp , L"%d,%d,[%d,\'%[^']', ... ");

いくつかの推奨事項:

  • バッファ オーバーランを回避するために、 a に読み込まれる文字数に制限を設けますchar[](以下の例では 32、null を終了するためのスペースを残すことを忘れないでください)。

    swscanf( szTemp , L"%d,%d,[%d,\'%32[^']', ... ");
    
  • からの戻り値を確認してくださいswscanf()。成功した割り当ての数を返します。投稿されたコードでは、14 個の割り当てが要求されているため、戻り値は 14 になるはずです (すべてが存在する必要がある場合)。

    if (14 == swscanf(...))
    {
        /* All good. */
    }
    
  • フォーマット指定子を使用して%n、入力バッファーがどの時点まで処理されたかを判別します。これは、バッファー全体が処理されたことを確認するのに役立ちます (バッファー全体が処理されることが予想される場合)。

    int pos;
    if (14 == swscanf(szTemp, "....%n", ...., &pos) &&
        pos == wcslen(szTemp))
    {
        /* All assignments made and processed entire buffer. */
    }
    
于 2012-08-06T08:36:00.473 に答える