示されているスニペットには、[少なくとも] 1 つの論理エラーと、論理ブール演算子とビットごとのブール演算子の間の混乱によって引き起こされた別のエラーがあります。
論理エラー:
2 番目c != EOF
のテストは、スペース ( c != ' ')
... c が EOF でない場合 (これが の制御条件) の場合にこの OR テストに到達するため while
、OR テストは常に真です!
...
while (c != EOF)
{
// This test always true regardless of c being a space or not
// Also it should be a logical OR, if at all. The bitwise OR will produce
// odd results if you are not sure of the bit patterns of the operands.
while (c != EOF | c != ' ')
{
putchar(c);
c = getchar();
}
...
演算子エラーの混乱: この例では、ビットごとのブール演算子 (および)ではなく、論理OR (または実際には論理 AND) 演算子、つまり||
およびそれぞれを使用する必要があります。&&
|
&
一般に、C ではブール条件を表現するために論理演算子を頻繁に使用することがわかります。これにより、変数のビット パターンを効果的にいじる必要がある場合 (たとえば、一部のビットをマスクしたり、強制的にセットなど)
さて、上記は「そのまま」コードの問題に対処しており、スペースが他の文字と同じように処理された理由を説明しているだけです.示されているロジックは明らかに間違っています。ここでは紹介しませんが、ヒントをいくつか。
- 前の文字がスペースであったかどうかを示す「状態」変数を導入する
- 単一の while ループを使用します (while は EOF または任意の終了条件ではありません)。
- ループ内で、状態 var が設定されていない限り、読み取った文字を体系的に出力します
- 現在の文字を条件付きで出力した後、状態文字を更新します。
一般的なヒントとして、ループ内でループ終了条件を繰り返す必要がある場合、それは多くの場合 (ただし常にではありません)、「コードのにおい」(つまり、コード/ロジックを修正する必要があることを示します) です。または、入力から読み取る複数のスポットを導入します (ここでは multiple getchar()
)