0

我正在阅读 K&R,问题是:编写一个程序以将其输入复制到其输出,将一个或多个空格的每个字符串替换为一个空格。在我的脑海中,我想我知道我需要做什么,设置一个布尔值来知道我何时在空间中。我已经尝试过了,但没有成功。我找到了这段代码并且它有效,我正在努力弄清楚是什么阻止了空间被写入。我想我可能有它,但我需要澄清。

#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。那么会发生什么?代码是否跳过返回 0;,不写任何东西,只是继续 while 循环?返回0;在循环之外,但这是我可以看到没有返回值的唯一方法。

4

4 回答 4

5

在此刻:

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

如果 inspace 等于 1,则不会执行 if 体,会跳转到:

if(c != ' ') { 

并且只要上面的 c == ' ' 为假,那么它就会跳过 if 正文并跳转到:

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

这将一直持续到文件结束或(c != ' ')评估为真。当 c 是非空格时:

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

inspace 归零,并打印字符。

于 2012-07-22T16:48:20.977 回答
0

是的,在您提到的情况下,它不写任何内容并在 while 循环中继续并获取下一个字符。如果下一个字符又是空格,那么它会做同样的事情,即不打印就进入下一个迭代。每当它找到第一个非空格时,它会将 inspace 设置为 0 并开始打印。

当 getchar 获取 EOF 时,while 循环将终止。然后程序将返回 0。

于 2012-07-22T16:45:59.657 回答
0

如果 if 语句中的条件不成立,则不执行以下表达式。这意味着相应括号内的所有内容都将被跳过,并且在右括号“之后”继续执行。

由于下面的 if 语句也是错误的,所以在 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 回答