1

複数の空白の文字列を単一の空白に置き換える単純な C プログラミング コードを書いています。私のコードは次のとおりですが、明らかにエラーが含まれています。配列またはポインターの使用を避けようとしています。私の間違いを修正する方法について何かアドバイスはありますか?

#include <stdio.h>
int main(void)
{
    int c,d;
    d=0;
    while((c=getchar())!=EOF)
        {
        if (c==' ')
            {
                d=getchar();
                if (d!=' '&&d!=EOF)
                    putchar(c);
            }
        putchar(c);
        }
}
4

8 に答える 8

3

この種のフィルタリングを行う場合、入力の読み取りを繰り返さないことをお勧めします。これは、ロジックがばらばらになる傾向があるためです。少なくとも私の経験では、入力を1か所で読み取って処理する方が簡単だと思います。

この問題には単純なステート マシンで十分です。最後の文字が空白かどうかを記憶し、最後に読み取った文字が空白でない場合にのみ空白を出力します。

于 2013-06-04T14:08:53.200 に答える
2

getcharまず: , の使用は避けてくださいputchar。代わりにgetcを使用してください。putc

文字ごとに読みたい場合は、次のようにします。

int c, lastc = '\0';
while((c = getc(stdin)) != EOF) {
    if (c == ' ' && lastc == ' ')
        continue;
    putc(c, stdout);
    lastc = c;
}
于 2013-06-04T14:08:00.970 に答える
1

フラグを使用して、空白を読んだかどうかを覚えておいてください。

#include <stdio.h>

int main( void )
{
  int lastBlank = 0;
  int c;

  while ( (c = fgetc( stdin )) != EOF )
  {
    if ( c != ' ' || !lastBlank )
      fputc( c, stdout );

    lastBlank = ( c == ' ' );
  }
  return 0;
}
于 2013-06-04T15:06:03.253 に答える
0
# include <stdio.h>

int main(){

  int c , n;
    n=0;

    while((c=getchar())!= EOF) {
        if (c == '\t') {

            if (n<1){
                putchar('\t');
                n=n+1;
            }
        }
        else {
            n=0;
            putchar(c);
        }
    }
}
于 2016-11-07T07:38:18.750 に答える