【问题标题】:ANSI C - Replacing blank characters without using arraysANSI C - 替换空白字符而不使用数组
【发布时间】:2012-05-18 12:09:15
【问题描述】:

我已经开始学习 Dennis Ritchie 和 Brian W.Kernighan 的“ANSI C 编程语言”。到目前为止,我刚刚学习了 getchar()、putchar()、while、for、if。有一个练习,我必须只使用我现在学到的东西来做。以上是我唯一知道的。这是书中出现的练习:

练习 1-9。编写一个程序,将其输入复制到其输出,用一个空格替换每个包含一个或多个空格的字符串。

我知道 C#、Pascal、Objective-C 和一些 Java,但我不明白如何在不使用数组的情况下解决这个问题。我知道数组,但由于作者尚未涵盖数组,但我认为我不能使用它们。数组将在下一章中讲授。

【问题讨论】:

  • 如果之前的getchar() 收到的char 不是空格,则始终putchar() 是最新的getchar() 收到的char
  • 您只需要一个变量来告诉您之前读取的字符是否为空格。
  • @hmjd,你能用代码说明一下如何做吗?

标签: c ansi getchar putchar


【解决方案1】:

实现 Nikolai 的解决方案,因为在代码中可能更容易理解,

#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

【讨论】:

    【解决方案2】:

    打印您看到的第一个空格(空白)字符,跳过其余字符。这意味着有一个布尔变量设置为false,一旦你看到一个非空白字符,设置为true,当你点击并打印第一个空格。如果该变量为true,则不要打印。一种两态的“状态机”。

    【讨论】:

    • 到目前为止你尝试过什么?如果您了解 Objective-C,您可能应该知道 ints 在 C 中可以被视为布尔值。我也没有真正了解您想在哪里使用数组。你得到一个char 的输入,将其与“空白”进行比较,然后根据你的状态打印(输出)你的输入,然后重复。
    • 我知道布尔值是什么,但到目前为止还没有关于布尔值的消息。所以我也不能使用它们。
    • 我想我会将整个输入视为一个字符数组并遍历它们。这是我会使用数组的地方。
    • 然后只保留前一个字符以检查上次迭代是否有“空白”。
    【解决方案3】:

    基于我的评论的示例:

    #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;
    }
    

    请注意,getchar() 返回,putchar() 接受 int,而不是 char

    【讨论】:

      【解决方案4】:

      一段时间后,我意识到我误解了这个问题,这个误解是因为我没有完全理解 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;
      }          
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多