31

私はこれを持っていますが、想定されるEOFに達すると、ループとscanfをもう一度繰り返すだけです。

int main(void)
{
        char words[16];

        while(scanf("%15s", words) == 1)
           printf("%s\n", words);

        return 0;
}
4

7 に答える 7

24

試す:

while(scanf("%15s", words) != EOF)

scanf出力を比較する必要がありますEOF

フォーマット文字列で幅を指定しているため15、最大で 15 文字を読み取ることができます。したがって、単語の char 配列のサイズは16( char の場合)15 +1である必要がありますnull。したがって、次のように宣言します。

char words[16];
于 2010-09-21T20:09:50.607 に答える
5

コードは、1 つの単語を読み取るまでループし、その後終了します。したがって、複数の単語を指定すると、最初の単語が読み取られて終了しますが、空の入力を指定すると、永遠にループします。いずれにせよ、初期化されていないメモリからランダムなガベージのみを出力します。これは明らかにあなたが望んでいるものではありませんが、何が欲しいですか? 最初の単語 (存在する場合) を読み取って出力するだけの場合は、次のように使用します。

if (scanf("%15s", word) == 1)
    printf("%s\n", word);

単語を読める限りループしたい場合は、while を使用します。

while (scanf("%15s", word) == 1)
    printf("%s\n", word);

また、他の人が指摘したように、単語配列に scanf に十分なサイズを与える必要があります。

char word[16];

scanf が一致したアイテムの数をチェックする代わりに、EOF をテストすることを提案する人もいます。EOF がない限り scanf が一致に失敗することはないこの場合には問題ありませんが、他の場合 (整数を読み取ろうとするなど) にはあまり適していません。 t 数値) を返し、0 を返します。

編集

私のコードと一致するように質問を変更したようです。コードを実行すると正常に動作します-EOFに達するまで単語の読み取りをループしてから終了します。したがって、コードで何か他のことが起こっています。おそらく、David が提案したように、入力にどのように入力しているかに関連しています。

于 2010-09-22T16:24:32.843 に答える
5

Scanf は、ほとんどの場合、価値があるよりも面倒です。あなたがやろうとしていることを行うための2つのより良い方法を次に示します。この最初のものは、多かれ少なかれコードを直接翻訳したものです。より長くなりますが、scanf とは異なり、それを見て何をするのかをはっきりと見ることができます。

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    char buf[1024], *p, *q;
    while (fgets(buf, 1024, stdin))
    {
        p = buf;
        while (*p)
        {
            while (*p && isspace(*p)) p++;
            q = p;
            while (*q && !isspace(*q)) q++;
            *q = '\0';
            if (p != q)
                puts(p);
            p = q;
        }
    }
    return 0;
}

そして、これが別のバージョンです。これが何をするのか調べるのは少し難しいですが、行が 1024 文字を超えても壊れないので、本番環境で使用するコードです。(まあ、実際に本番環境で使用するのは ですtr -s '[:space:]' '\n'が、これはそのようなものを実装する方法です。)

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    int ch, lastch = '\0';
    while ((ch = getchar()) != EOF)
    {
        if (!isspace(ch))
            putchar(ch);
        if (!isspace(lastch))
            putchar('\n');
        lastch = ch;
    }
    if (lastch != '\0' && !isspace(lastch))
        putchar('\n');
    return 0;
}
于 2010-09-21T20:09:59.873 に答える
2

Windows を使用している場合は、EOFEnter キーを押すのではなく、コンソールでCrtl+キーを押すと Man にアクセスできます。Zこれにより、 の指標である "^Z" が出力されEOFます。これを読み取るときの関数の動作 (EOFまたはCrtl+ Z):

関数 出力
scanf(...) EOF
gets(<variable>) NULL
feof(stdin) 1
getchar() EOF
于 2019-11-01T04:12:34.537 に答える
0

EOFに対してではなく、に対して戻り値をチェックする必要があります1

あなたの例では、2 つの異なる変数名 と も使用していることに注意しwordsてください。wordwordsNUL

于 2010-09-21T20:09:21.683 に答える
-1

これを行う最善の方法は...

int main()
{
    char str[100];
    scanf("[^EOF]",str);
    printf("%s",str);
    return 0;     
}
于 2013-12-05T14:16:03.643 に答える
-6

Cユーザーの場合、これも機能します

while ( gets(str) != NULL )
于 2013-01-21T18:18:47.513 に答える