1

この質問はK&Rの演習1.9にあります。私は次のコードを書きました:

#include<stdio.h>
main()
{
    int c,i=0,n=0;
    while((c=getchar())!=EOF)
    {
         if(c!=' '||c!='\t')
         {
             i=0;
             putchar(c);
         }
         else if(c==' '||c=='\t')
         {
              i++
         }
         if((c+1)!=' '||(c+1)!='\t')
               n=i;
         if(n!=0)
        {
               c=' ';
               putchar(c);
        }
    }
}

しかし、私は望ましい出力を得ることができませんでした。私はubuntuでgccを使用しています。入力のようなものhello\t\taを入力すると、出力は次のようになります。hello\_\_aつまり、タブの数がスペースの数に置き換えられ、入力するとhello\_\_a、出力は入力と同じになります。

それを手伝ってくれるか、希望の出力を得るために何か新しいことを提案してください。

4

3 に答える 3

2

あなたに完全に機能するプログラムを与える代わりに、私はあなたを正しい方向に導くことを好みます。

まず第一に、c+1「入力の次の文字」を意味するのではありません。1の値に追加するだけで、 ASCIIテーブルの次の文字にc効果的に変換されます。たとえば、isの場合は、ASCIIテーブル次の文字であるを意味します。is (単一のスペース)で、テーブルに32のコードがある場合、は、テーブルに33のコードがあります。cc'a'c+1'b'c' 'c+1'!'

さて、次のキャラクターを取得するには、それを読む必要があります!同じように、最初の文字を読みます。これを実現する最善の方法は、常に前の読み取り文字を保持し、現在読み取られている文字でそれを確認することです。

したがって、たとえばcとの2つの変数が必要ですpc。文字を読み、に保存しcます。最初pcはです'\0'。読み取った文字がスペースまたはタブでない場合は、出力に書き込みます。タブの場合は、スペースに変更します。また、スペースの場合は、前の文字(pc)を確認します。スペースでない場合は、を印刷しますc。ループの最後に、の値をに格納する必要cがあります。pcこれは、前の文字を。に保持していることを意味しますpc

私はあなたに完全な解決策を言ったと思います!

于 2013-02-21T10:47:30.997 に答える
1

アプローチは少し間違っています。ここにヒントがあります。最後の文字を状態のままにします。新しく入力した文字がスペースで、最後の文字がスペースの場合は、出力せず、ループに戻って待機します。次のキャラクター。

現在の文字がスペースでない場合は、状態を出力して更新します...

于 2013-02-21T10:34:12.110 に答える
1

問題は、次の文字を確認したいが、現在の文字の値を1つ増やして確認することです。

于 2013-02-21T09:32:06.460 に答える