我正在尝试在教科书中重新创建程序,并显示下面的语法。但是,当我添加该行以检测选项卡时[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((。它将检查白空间字符。