0

これは K&R 演習です。ダブル以上のスペースを1つのスペースに置き換えることになっています。代わりに、入力、スペース、およびすべてを正確にミラーリングします。また、他の演習では EOF (ctrl-d) を使用し、この演習では RETURN (Enter) を使用する必要があるのはなぜですか? (Ubuntuで実行していますが、Macからsshを使用しています。)

 #include <stdio.h>

 main()
 {

   int c;

   c = getchar();

   while (c != EOF)
     {
       while (c != EOF | c != ' ')
         {
           putchar(c);
           c = getchar();
         }
       putchar(c);
       c = getchar();
         while (c == ' ' | c != EOF)
           c = getchar();
     }
4

4 に答える 4

3

示されているスニペットには、[少なくとも] 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())

于 2013-03-08T06:02:49.553 に答える
1

コードには2つの問題があります。

1つ目は、論理OR演算子(||)を使用しようとしているが、ビット単位のOR(|)を使用していることです。2つ目は、とにかく、論理ORではなく論理ANDを使用する必要があるということです。

while (c != EOF && c != ' ')
于 2013-03-08T06:06:09.100 に答える
1

このループを試してください:

   while (c != EOF)
     {
       if (c == ' ')
         {
           putchar(c);
           while(c == ' ' && c != EOF)
             c = getchar();
         }
       else
         {
           if (c != EOF)
             putchar(c);
           c = getchar();
         }
     }
于 2013-03-08T06:08:43.423 に答える
0

これは、多くの get と put 、および値のチェックです。これは、タブも処理するよりクリーンなものです。

void main (void)
{
int F_space=F_tab=0;    // Flags for special chars
char ch;
do
    {
    ch = getchar();

    // test for special characters
    switch (ch)
        {
        case ' ':   // space
            F_space = 1;
            continue;

        case '\t':  // tab
            F_tab = 1;
            continue;

        default:    // anything else
            // output a space if necessary
            if (F_space || F_tab) {
                F_space = F_tab = 0;    // clear flags
                putchar (' ');
            }
            break;
        }

    // output the character
    putchar (ch);
    break;
    } 
while (ch != EOF);
于 2014-06-26T23:44:10.990 に答える