0

デニス・リッチーとブライアン・W・カーニハンによる「ANSICプログラミング言語」の勉強を始めました。これまでのところ、getchar()、putchar()を学習しましたが、for、if。今までに学んだことだけを使ってやらなければならない運動があります。私が知っているのは上記だけです。本に登場する演習は次のとおりです。

演習1-9。1つ以上のブランクの各文字列を単一のブランクに置き換えて、入力を出力にコピーするプログラムを作成します。

C#、Pascal、Objective-C、および一部のJavaは知っていますが、配列を使用せずにこの問題を解決する方法を理解できません。私は配列を知っていますが、作者はまだ配列をカバーしていないので、私はそれらを使用してはならないと思います。配列については、次の章で説明します。

4

4 に答える 4

2

コードで理解しやすいかもしれないので、ニコライのソリューションを実装すると、

#include <stdio.h>
#include <stdbool.h> /* C99, but a good idea to use nonetheless */

int main() {
    bool was_space; /* state variable */
    char c; /* one-character buffer */

    while ( ( c = getchar() ) != EOF ) {
        if ( ! was_space || c != ' ' ) putchar( c );
        was_space = c == ' ';
    }
    return 0;
}

http://ideone.com/LLmBh

本当に避けたい場合はbool、代わりに使用できますint

于 2012-05-18T12:24:06.963 に答える
1

私のコメントに基づく例:

#include <stdio.h>

int main()
{
    int previous_char = 0;
    int latest_char;

    while ((latest_char = getchar()) != EOF)
    {
        if (' ' != previous_char || ' ' != latest_char)
        {
            putchar(latest_char);
        }
        previous_char = latest_char;
    }
    return 0;
}

、notをgetchar()返し、putchar()受け入れることに注意してください。intchar

于 2012-05-18T15:19:02.257 に答える
1

表示された最初の空白 (空白) 文字を出力し、残りはスキップします。つまりfalse、非空白文字が表示されるとすぐに設定されtrue、最初の空白をヒットして印刷すると設定されるブール変数を持つことを意味します。その変数が の場合は印刷しないでくださいtrue。一種の 2 状態の「ステート マシン」。

于 2012-05-18T12:13:41.080 に答える
0

しばらくして、私は質問を誤解していることに気付きました。この誤解は、getchar()およびputchar()関数のメカニズムを完全に理解していなかったためです。最初、私は弦全体を取り、それからそれを通り抜けなければならないと思いました。しかし、「while((input_char = getchar())!= EOF)」はある種の反復を行うことを理解しました(おそらく反復のシミュレーションですが、確かにはわかりません)。その後、残りは通常のロジックです。コードを見ると、おそらくif-elseパターンを使用していないことに気付くでしょう。これは、「If」がこれまでに得た唯一のものであり、他のプログラミング言語から知っている他のものを使用するべきではないためです(ただし、if-elseはどの言語でも見つかると確信しています)。&&、||、booleanも見たことがありません。また、counter++の代わりに++counterを使用しました。それはまた、私たちがまだインクリメントを投稿するようになっていないからです。誰もが知っている最も単純なロジックであることは知っていますが、とにかく共有したいと思いました。

#include <stdio.h>
int main()
{
   int input_char;
   int counter = 0;
   while ((input_char = getchar()) != EOF)      
   {
     if (input_char == ' ')
     {
        ++counter;
        if (counter == 1)
          putchar(input_char);
     }

     if (input_char != ' ')
     {
        putchar(input_char);
        counter = 0;
     }
   }
  return 0;
}          
于 2012-05-19T06:05:12.973 に答える