在文本中将空格限制为只有一个 - c

时间:2012-07-22 16:40:07

标签: c getchar

我正在阅读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 个答案:

答案 0 :(得分:5)

此时:

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

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

if(c != ' ') { 

只要上面的c ==''将为false,那么它将跳过if body并跳转到:

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

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

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

将空格置零,并打印字符。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果if语句中的条件不为true,则不执行以下表达式。这意味着跳过相应括号内的所有内容,并在结束括号后“继续执行”。

由于以下if语句也是false,因此在for循环的迭代中没有任何操作。

答案 3 :(得分: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);
  }
}