2016-12-19 9 views
6

これはsscanf usage - how to verify a completed scan vs an aborted scanに関連していますが、それはその問題でカバーされていない縁です。sscanfの末尾のテキストに一致していますか?

char entry[] = "V2X_3_accepted"; 
int d1,d2,ret1,ret2; 
ret1 = sscanf(entry,"V2X_%d_expected",&d1); 
ret2 = sscanf(entry,"V2X_%d_received",&d2); 

予想される結果:ret1==0; ret2==0; d1, d2は未定義です。

実際の結果:ret1==1; ret2==1; d1=d2=3

最後に%nを使用すると、一致する文字列が同じ長さになるので、助けになりません。連続したstrncmpなどを実行せずに、後続のテキストと一致する素敵なトリックがありますか?

+0

@ user3121023:ニース!答えとして投稿してください。 –

答えて

2

の使用に関する詳細のドキュメントを見つけることができます。 @user3121023

'\n'のようなオプションの末尾の空白は"V2X_3_expected\n"を渡すと"V2X_3_expected 123"を失敗する%n結果を確認できるように" %n"の使用をお勧めします。スキャンして設定することはないだろう値に

char entry[] = "V2X_3_accepted"; 

int d1,d2; 
int n1 = 0; 
int n2 = 0; 

sscanf(entry,"V2X_%d_expected %n",&d1, &n1); 
sscanf(entry,"V2X_%d_received %n",&d2, &n2); 
if (n1 > 0 && entry[n1] == '\0') Success_expected(d1); 
else if (n2 > 0 && entry[n2] == '\0') Success_received(d2); 
else Fail(entry); 

初期n1"%n"指定子に達しました。 n1 = 0;は、ほとんどの場合、OPのフォーマット"V2X_%d_ ..."のようにうまく機能します。

n1 = -1; /* and (n1 >= 0 */は、" %n"のような短い形式でも動作します。

-2

のscanfの戻りなステートメントは、彼はあなたが1を求める場合

ret1 = sscanf(entry,"V2X_%d_expected",&d1);

およびscanfの戻り値は1になりますsuccedを「埋める」ように成功することをあなたに逢引の数を伝えます。

これは完全に正常です。

あなたは"%n"が正常に動作します使用してコマンドラインman scanf

+3

この回答は、残念なことに、絶対に正しく、完全に役に立たない。 –

+0

私の悪い私は全体の質問を理解していない – Zouz

関連する問題