【问题标题】:remove trailing blanks删除尾随空格
【发布时间】:2012-08-24 13:24:12
【问题描述】:

我正在处理 k&r,我正在处理问题 1-18。编写一个程序,从输入的每一行中删除 TRAILING 空格和制表符,并删除整个空白行。我的想法是阅读每一行并计算空格数。如果它是第一个空白打印它使用 putchar。如果有第二个空白,请不要打印并将空格重置为 0。然后继续阅读并删除空格。

目前我只能打印它读取的任何其他内容,因为我正在尝试一点一点地做到这一点。一旦我运行这个程序,我会在终端中得到其中两个 ��。我认为我在错误地嵌套 if 语句或 else 语句时遇到了问题,我之前在那里遇到了一些错误。我是否正在讨论以正确方式删除空白的逻辑?如果有人能指出我正确的方向来修复代码,我将不胜感激。

#include <stdio.h>

main()
{
    int c, i, spaces;             /*c for input, i for counting*/

    i = 0;
    c = 0;
    spaces = 0;
    while ((c = getchar())!=EOF)
            if(spaces = 0 && c == ' ')
                    ++spaces;
                    putchar(c);
                    if(spaces >= 1)
                            spaces = 0;
            else {
                    putchar(c);
            }


}

【问题讨论】:

  • 我没有检查其余的逻辑,但这个if(spaces = 0 &amp;&amp; c == ' ') 应该是if(spaces == 0 &amp;&amp; c == ' ')===
  • 谢谢,愚蠢的错误。这将终端中奇怪的问号减少到一个
  • 您是否应该使用 getchar() 来解决这个问题(而不是读取整行)?
  • 到目前为止我只在书中看到过 getchar()
  • 您说要删除 TRAILING 空格。我认为在您阅读整行之前不可能知道是否有空格。除非该行永远不会嵌入空格,在这种情况下,您需要一个非空格标志,而不是空格。

标签: c if-statement whitespace


【解决方案1】:

尝试:

if(spaces == 0 && c == ' ')
{
   ++spaces;
   putchar(c);
   if(spaces >= 1)
      spaces = 0;
}
else 
{
   putchar(c);
}

您的缩进表明您希望 else 分支与第一个 if 一起使用,但现在它与内部 if 相对应。

另外,spaces = 0 是一个赋值,spaces == 0 是一个比较。

【讨论】:

  • 程序至少现在可以运行了,谢谢,但是它并没有做它应该做的事情。也许我做错了
  • 它基本上将所有字符都正确地放回并且运行良好。但它不会删除尾随空格
  • 那么我不明白你的问题
  • @bigl 你知道调试是什么意思吗?
  • 我明白了,谢谢。我以前从未使用过这个,因为我很新。我已经重写它现在可以工作了
【解决方案2】:
  • 读取字符串。
  • 使用 strlen() 或类似方法查找字符串的结尾。
  • for(i=string_length-i; i&gt;=0; i--) 或根据需要使用指针。
  • 找到第一个非空间时断开循环。
  • 在第一个非空格+1 处插入空终止符。

【讨论】:

    猜你喜欢
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2015-07-06
    • 1970-01-01
    • 2016-09-10
    • 2015-05-11
    相关资源
    最近更新 更多