4

文字列からいくつかの値を取得するためにCでsscanfを使用しようとしています。ただし、文字列に必要以上の値がある場合は、エラーをスローするために必要です。すなわち。整数が必要な場合、「2」は問題ないはずですが、「25」はクラッシュするはずです。

sscanfの戻り値を次のように使用します。

if (sscanf(mystring, "%d %*s", &num) == 1)

文字列が長くても1が返されるため、機能しません。私がすることができます:

char tmpString [100];
if (sscanf(mystring, "%d %s", &num, tmpString) == 1)

これは問題なく動作しますが、特に良いとは言えません。別の方法はありますか?割り当て抑制を使用しても、必要な戻り値を取得できますか?

編集これは私が使用したコードです:

char c; // This is a global variable, just gets used over and over.
sscanf(mystring, "%d%c", &num, &c);
    if (c == '\n') {
4

2 に答える 2

3

1つの可能性は次のとおりです。

int pos;
if (sscanf(mystring, "%d %n", &num, &pos) == 1)
{
    if (mystring[pos] != '\0')
        ...oops...extra data...
    else
        ...only number...
}
else
    ...not even one number...

これ%nはC89の一部です。これは、特に一般的に使用されている(または広く知られている)変換仕様ではありません。コンバージョンとしてカウントされません(したがって、のテスト1)。

于 2012-04-14T04:33:12.860 に答える
0

scanf戻り値と文字数の1つのテストではなく、戻り値だけを使用するより簡単なテストは、次の方法で可能です。

if (1 == sscanf(mystring, "%d %c", &num, &(char){0}))

これが機能するのは、末尾のスペースが消費された後に文字がある場合、2番目の割り当てが実行されるため、戻り値が1ではなく2になるためです。

(これ(char){0}は、割り当てられたを保持するための一時オブジェクトを提供する複合リテラルでcharあり、その後は破棄されます。)

于 2021-01-14T12:08:45.277 に答える