如何创建一个程序来用单个空格/选项卡替换多个空格/选项卡?

时间:2019-07-02 19:23:42

标签: c++ c

我正在尝试使用以下语法在我的教科书中重新创建一个程序。但是,当我在用于检测标签的行中添加[if(((c =''|| c ='\ t']]和上面的反向版本,并且一次只打印一个标签时,它会使整个文本再偏移一些左侧的“标签”。如果我删除标签的提及,则可以完美地使用空格,希望对您有所帮助。

我曾尝试从我的书中提出这个问题,但最终集中在本站点的答案上(https://clc-wiki.net/wiki/K%26R2_solutions:Chapter_1:Exercise_9)为简洁起见,我不会发布最有效的代码,但这是在如果要查询,请在页面的最底部。之后,我将目光转向了代码(下面列出了其中的一部分),该代码可以使用选项卡来回答Q,而该选项卡原本不在Q中。

int main(void)
{
    int c, p;
    p = 0;

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

    {
        if (c != ' ' || c!= '\t')
        {
            putchar(c);
            p= 0;
        }

         if ((c == ' ' || c== '\t') && p<1) 
        {
                putchar(c);
                p++;
        }

    }   if (c == '\n')
        p = 0;
}

______________________________________________________________________________________________我列出的网站上的另一个示例,我认为语法简洁而有趣。

while ((c = getchar()) != EOF) 
{ if (c == ' ' || c == '\t') 
{ while ((c = getchar()) == ' ' || c == '\t')

没有错误消息出现,但在''[tab] [tab] hello world之类的实例中 ,我希望“您好,世界”。但是我以某种方式得到了“ [tab] [tab] [tab] [tab] hello world”。看来,包括制表符和空格在内的输出都增加了2倍。

2 个答案:

答案 0 :(得分:5)

问题出在这里:

if (c != ' ' || c!= '\t')

让我们看一下三种情况:

  • c == ' '是对的。这意味着c != '\t'也为true,因此执行if语句。
  • c == '\t'是对的。这意味着c != ' '也为true,因此执行if语句。
  • c都不是。这意味着c != ' '为true,因此执行if语句。

在每种可能的情况下,都会执行if语句。

建议的解决方案:将其重写为

if (c != ' ' && c != '\t')

使用“ &&”而不是“ ||”。

答案 1 :(得分:2)

由于您的第一个if语句将始终评估为true,因此将首次调用putchar,并将p设置为0。由于p为0,因此第二个if语句将始终为true。这将第二次调用putchar。您可能要使用isspace()。它将检查空格字符。