如何创建一个程序来替换单个空白/选项卡的多个空白/选项卡



我正在尝试在教科书中重新创建程序,并显示下面的语法。但是,当我添加该行以检测选项卡时[if(((c =''|| c =' t']((以及上面的倒置版本,然后一次仅打印一个选项卡,它将整个文本移动几个左侧的"标签"。如果我删除标签,它可以与空白完美搭配。希望这会有所帮助。

我在书籍之前尝试过这个问题,但最终专注于本网站的答案(https://clc-wiki.net/wiki/wiki/k&r2_solutions:chapter_1:ercercise_9('t发布了最有效的代码,但是如果您想咨询,它是页面底部的代码。之后,我将视线更改为代码(下面列出的一部分(,它也可以用最初在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] [TAB] Hello World。它似乎将输出增加了2倍,包括标签和空白。

问题在此行:

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

让我们看三种情况:

  • c == ' '是正确的。这意味着c != 't'也是正确的,因此IF语句执行。
  • c == 't'是正确的。这意味着c != ' '也是正确的,因此IF语句执行。
  • c都不是。这意味着c != ' '是正确的,因此IF语句执行。

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

提出的解决方案:将其重新编写为

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

使用'&amp;''而不是'||'。

,因为您的第一个if语句将始终评估为true putchar,将被称为第一次,并且p将设置为0。由于p是0,因为p是0,如果语句始终是正确的。这将把Putchar称为第二次。您可能需要使用ISSPACE((。它将检查白空间字符。

最新更新