我正在尝试使用以下语法在我的教科书中重新创建一个程序。但是,当我在用于检测标签的行中添加[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] [tab] hello world”。它似乎将包括制表符和空格在内的输出提高了2倍。
最佳答案
问题在这条线上:
if (c != ' ' || c!= '\t')
让我们看三种情况:
c == ' '
是正确的。这意味着c != '\t'
也为true,因此执行if语句。c == '\t'
是正确的。这意味着c != ' '
也为true,因此执行if语句。c
都不是。这意味着c != ' '
为true,因此执行if语句。在每种可能的情况下,都会执行if语句。
建议的解决方案:将其重写为
if (c != ' ' && c != '\t')
使用“ &&”而不是“ ||”。