我正在阅读 K&R 的《C 编程语言》,目前正在做练习 1-12。我面临的问题不是完成练习本身,而是修复由于我的代码而出现的错误。
当遇到两个或多个空格时,代码会产生不需要的空行。我想确保输出没有空行并且多余的空格被修剪。
我的解决方案。
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF)
{
if (c == ' ' || c == '\t')
{
printf("\n");
}
else
{
putchar(c);
}
}
}
输出有问题
bash >>> ./Exercises/ex12
hello everyone
hello
everyone
我尝试根据Ex 1-9 [2]解决它,但没有成功。
#include <stdio.h>
#define PREVCHAR 'a'
int main(void)
{
int c, prevc = PREVCHAR;
while ((c = getchar()) != EOF)
{
if (c == ' ' && prevc == ' ')
{
printf("");
} else if (c == ' ' && prevc != ' ')
{
printf("\n");
} else
{
putchar(c);
prevc = c;
}
}
}
[1] = 编写一个程序,每行打印一个单词的输入。
[2] = 编写一个程序将其输入复制到输出,用一个空格替换每个包含一个或多个空格的字符串。
我认为你想要实现以下输出:
hello
everyone
出现空行的原因是您的算法只是用新行替换每个空格/制表符。 您的主要想法是简单地检查前一个字符是否是空格或制表符是否正确。 问题是,你只设置
prev
,以防它不是空格。
因此,prev
永远不会是空格或制表符。
此外,我建议这样做:
#include <stdio.h>
int main(void)
{
int c;
bool previousWasBlank = false;
while ((c = getchar()) != EOF)
{
if (c == ' ' || c == '\t')
{
if (!previousWasBlank)
printf("\n");
previousWasBlank = true;
}
else
{
putchar(c);
previousWasBlank = false;
}
}
}