1

ここでの初心者の質問です。関連する例を見つけることができませんでした。fgets と sscanf を使用して stdin から整数入力を取得し、それを配列に書き込む C プログラムに取り組んでいます。ただし、fgets を配列に書き込む方法がわかりません。

#define MAXINT 512
char input[MAXINT]

int main(void)
{
    int i;
    int j;
    int count=0;
    int retval;

    while (1==1) {
        fgets(input, MAXINT[count], stdin);
        retval = sscanf(input, "%d", &i);

        if (retval == 1) {
            count = count++;
            }
        else
            if (retval != 1) {
                break;
                }
        }

fgets を for ループに入れますか? それともそれよりも複雑ですか?

4

3 に答える 3

2

fgets()charの配列ではなく、文字列 ( の配列) に読み込みますint

ループは次のようになります。

char line[4096];

while (fgets(line, sizeof(line), stdin) != 0)
{
    ...code using sscanf() iteratively to read into the array of int...
}

入力をチェックしないと問題が発生します。せいぜい、コードは入力の最後の行を 2 回処理することになるでしょう。私の払い戻しが 2 回処理されることを意味する場合にのみ、それを行うことが許可されます。最悪の場合、プログラムが飽きて死ぬか、メモリが不足するか、我慢できなくなって強制終了するまで、コードが終了しない可能性があります。

[これは] while ループ内で配列にどのように書き込むかという質問には答えません。多くの数値が入力された場合、sscanf関数をループで囲みますか? forEnter が押されるたびに何かを実行するように設定しますか?

1 行に 1 つの数値しかない場合、ループ本体のコードは単純です。

char line[4096];
int  array[1024];
int  i = 0;

while (fgets(line, sizeof(line), stdin) != 0)
{
    if (i >= 1024)
        break;  // ...too many numbers for array...
    if (sscanf(line, "%d", &array[i++]) != 1)
        ...report error and return/exit...
}

このコードは、同じ行にガベージ (他の数字、非数字) があるかどうかを認識しないことに注意してください。単純に最初の番号 (ある場合) を取得し、残りは無視します。

1 行に複数の数字が必要な場合は、詳細についてループ内での使用方法をsscanf()参照してください。

空行で入力を終了させたい場合、fscanf()orを使用scanf()するオプションはありません。複数の空白行を読み込んで入力を探します。

于 2013-11-07T20:33:19.080 に答える