5

入力を 1 行に 1 語出力するプログラム。

int main() {

    int c;

    while ((c=getchar()) != EOF) {

        if (c== ' ' || c== '\n' ||c == '\t')
                putchar('\n');
        else {
            putchar(c);
        }
    }
    return 0;
}

上記のプログラムは、結果を 1 行に 1 語ずつ正しく出力します。それに応じて条件を変更した後、以下のプログラムも1行に1単語を出力することを期待していました。ただし、正しい結果が得られません。私はばかげた間違いを犯していますか、それとも何か問題がありますか?

int main() {

    int c;

    while ((c=getchar()) != EOF) {

        if (c != ' ' || c != '\n' || c != '\t')
            putchar(c);
        else {
            putchar('\n');
        }
    }

    return 0;

}
4

8 に答える 8

16

正しい状態変化は次のとおりです。

if (!(c == ' ' || c == '\n' || c == '\t'))

また

if (c != ' ' && c != '\n' && c != '\t')

ド・モルガンの法則を見る

于 2011-05-16T20:55:40.203 に答える
4

元の質問に対して多くの回答が得られましたが、細かい点を 1 つ追加しなければならないと感じています。元のバージョンと変更されたバージョンの両方に、問題と思われる問題がいくつかあります。まず、空白を実際には正しく検出せず (たとえば、垂直タブや、ロケールで定義されているその他の空白を無視します)、単語が複数の空白文字で区切られている場合は空白行を生成します。 .

最初の問題については、isspace知っている空白文字と直接比較する代わりに使用します (ちなみに、発生した問題の原因を排除します)。2 つ目については、最初の空白文字に遭遇したときに連続するすべての空白文字をスキップするロジックを追加するか、現在の文字が空白前の文字である場合にのみ改行を書き出すフラグを追加できます。あなたが書いたのは改行ではありませんでした。

または、次の変換を使用scanfして単語を読み取ることもできます。%s

char buffer[256];

while (scanf("%255s", buffer))
    printf("%s\n", buffer);

ただし、このアプローチでは、1 つの単語のサイズに上限が課されます。通常の状況では、それが問題になることはめったにありませんが、入力の性質によっては、問題になる可能性があります。

于 2011-05-16T21:08:19.577 に答える
3

||s を&&sに変更する必要があります。

        if (c != ' ' || c != '\n' || c != '\t')

        if (c != ' ' && c != '\n' && c != '\t')

つまり、「IF c がスペースに等しくない AND c が return に等しくない AND c がタブに等しくない THEN ...」

于 2011-05-16T20:56:06.277 に答える
2

ロジック プログラミング クラスを思い出してください。

!(A || B) == (!A && !B)
!(A && B) == (!A || !B)

つまり、条件は次のように読む必要があります。

if ( c != ' ' && c != '\n' && c != '\t' )
于 2011-05-16T21:00:14.480 に答える
1

MByD が言ったことを実行することも、or (||) を and (&&) に変更することもできます。

于 2011-05-16T20:57:32.547 に答える
0

エラーは条件式にあります。最初の式を否定すると

!(c== ' ' || c== '\n' ||c == '\t')

あなたが得る:

c!= ' ' && c!= '\n' &&c != '\t'

あなたの質問で定義したのではありません。

覚えて:

(A && B) は (!A || !B) と同じです。

于 2011-05-16T20:57:55.063 に答える
0

の反対A or B or Cnot A and not B and not Cであるため、次を使用します。

if(c != ' ' && c != '\n' && c != '\t')
于 2011-05-16T20:58:10.953 に答える
0

DeMorgan's Lawsについてもう少し勉強する必要があります。組み合わせ演算子を「||」から変更するだけでは十分ではありません 「&&」にするには、同じ解セットを取得するために結合されるすべての要素を否定する必要もあります。

于 2011-05-16T21:01:07.593 に答える