0

私は K&R を読んでいますが、質問は次のとおりです。入力を出力にコピーするプログラムを作成し、1 つ以上の空白の各文字列を単一の空白に置き換えます。私の心の中では、自分が何をする必要があるかを知っていると思います。ブール値を設定して、いつスペースにいるのかを知ることができます。私はそれを試みましたが、成功しませんでした。私はこのコードを見つけましたが、それは機能します。何がスペースの書き込みを妨げているのかを理解するのに苦労しています。私はそれを持っているかもしれないと思いますが、明確にする必要があります。

#include <stdio.h>

int main(void)
{
  int c;
  int inspace;

  inspace = 0;
  while((c = getchar()) != EOF)
  {
    if(c == ' ')
    {
      if(inspace == 0)
      {
        inspace = 1;
        putchar(c);
      }
    }

    /* We haven't met 'else' yet, so we have to be a little clumsy */
    if(c != ' ')
    {
      inspace = 0;
      putchar(c);
    }
  }

  return 0;
}

作業するテキストファイルを作成しました。テキストは次のとおりです。

so this    is where    you have been

「this」の「s」の後、状態は 1 に変わります。これは、スペースにいるためです。スペースが書き込まれ、次のスペースが読み取られます。それでは、次のように入力します。

while((c = getchar()) != EOF)
      {
        if(c == ' ')
        {
          if(inspace == 0)
          {
            inspace = 1;
            putchar(c);
          }

しかし、inspace は 0 ではなく、1 です。コードはスキップして return 0; になり、何も書き込まずに while ループを続行しますか? 0 を返します。はループの外にありますが、これが値が返されていないことを確認できる唯一の方法です。

4

4 に答える 4

5

この時点で:

if(c == ' ')
{
   if(inspace == 0) // <-- here

inspace が 1 の場合、if 本体は実行されず、次の場所にジャンプします。

if(c != ' ') { 

上記の c == ' ' が false である限り、if 本体をスキップして次の場所にジャンプします。

while((c = getchar()) != EOF) {

そして、これはファイルの終わりまで、または(c != ' ')true と評価されるまで続きます。c が非スペースの場合:

 if(c != ' ')
 {
   inspace = 0;
   putchar(c); 

inspace がゼロになり、文字が出力されます。

于 2012-07-22T16:48:20.977 に答える
0

if ステートメントの条件が真でない場合、次の式は実行されません。これは、対応する括弧内のすべてがスキップされ、実行が閉じ括弧の「後」から再開されることを意味します。

次の if ステートメントも false であるため、この for ループの反復内では何も実行されません。

于 2012-07-22T16:49:06.063 に答える
0

inspace が 1 で c が ' ' の場合、式:

inspace == 0

0 に評価され、コード

inspace = 1;
putchar(c);

実行されません。

その後、可能であればプログラムは while ループの次の反復に進みますが、while ループが終了するまで 0 を返しません。

while ループを次のコードに簡略化できます。

while((c = getchar()) != EOF)
{
  if(c == ' ')
  {
    if(inspace == 0)
    {
      inspace = 1;
      putchar(c);
    }
  } else
  {
    inspace = 0;
    putchar(c);
  }
}
于 2012-07-22T17:00:16.010 に答える
0

ええ、あなたが言及した場合、何も書き込まず、while ループを続行し、次の文字をフェッチします。次の文字が再びスペースである場合、同じことを行います。つまり、印刷せずに次の反復に進みます。最初の非スペースが見つかると、インスペースを 0 に設定して印刷を開始します。

getchar が EOF をフェッチするたびに while ループが終了します。その後、プログラムは 0 を返します。

于 2012-07-22T16:45:59.657 に答える