web-dev-qa-db-ja.com

sscanfの動作/戻り値

私はCを学び、オンライン講義から次のコードを理解しようとしている初心者です。文字列をスキャンして整数を探します。文字が検出された場合、sscanfは失敗します。

int n; char c;
if (sscanf(string, " %d %c", &n, &c) == 1)
    //return the integer

else
    // fail

Sscanfのマニュアルページを読みましたが、戻り値の確認と、このコードが機能する理由についてまだ混乱しています。 「これらの関数は割り当てられた入力項目の数を返す」と述べています。

Sscanfが文字のみを検出した場合、それらは&cに書き込まれます...ただし、その場合、&nは書き込まれません。この場合、sscanfの戻り値はまだ1だと思いましたか?

9
drjimmie1976

Sscanfが%dを正常に読み取り、他に何も読み取らなかった場合、1を返します(1つのパラメーターが割り当てられています)。数字の前に文字がある場合は、0を返します(存在しない整数を最初に見つける必要があるため、パラメーターは割り当てられませんでした)。追加の文字を含む整数がある場合、両方のパラメーターを割り当てることができたため、2が返されます。

8
Aneri

sscanf(string, " %d %c")EOF01または2を返します。

2:入力が以下に一致する場合
[オプションのスペース] [10進数*] [オプションのスペース] [任意の文字] [余分な無視]

1:入力が上記で失敗したが、以下と一致した場合
[オプションのスペース] [10進数*] [オプションのスペース] [これ以上データなし]

[補正]
0:入力で、空白とオプションの記号の後に数字が見つからなかった場合:例:"z"または"-"

EOF:入力が空の場合""または空白のみ。

  • 10進数の前には、符号文字+または-を付けることができます。
4
chux

以下のようにprintfステートメントに関数を入れることで、関数が何を返すかをいつでも確認できます。

printf("%d",sscanf(string, " %d %c", &n, &c));

これはおそらく、端末にsscanfの戻り値を出力することで、疑問を解消するでしょう。

また、これをチェックすることができます: cplusplus:sscanf

それが役に立ったことを願っています:)

2
Dangling Cruze