我成功地复制了K&R 1.9的答案,
写一个程序把输入复制到输出,
将一个或多个空白的字符串替换为单个空白。
我遵循的代码如下:
#include <stdio.h>
int main(void)
{
int c;
int inspace;
inspace = 0;
while((c = getchar()) != EOF)
{
if(c == ' ')
{
if(inspace == 0)
{
inspace = 1;
putchar(c);
}
}
/* We haven't met 'else' yet, so we have to be a little clumsy */
if(c != ' ')
{
inspace = 0;
putchar(c);
}
}
return 0;
}
我相信是因为
c=getchar()
在while循环中,每当代码完成if语句的后续操作时,程序将自动请求用户输入。
然而,为了测试我的理解,我想试着手动地
c=getchar()
在每个语句的末尾,它是必需的,而不是放在循环中,这样它就自动为我做了。这将类似于《K&R》的作者将其放在《K&R》第二版第16页。我相信这将测试我对整个代码中何时调用getchar()的理解。
下面是第16页的代码:
{
int c;
c=getchar();
while (c !=EOF) {
putchar(c);
c=getchar();
}
}
作者重申c=getchar(),而不是将其放入while循环中。
这是我修改过的代码,目的是在每个相关语句的末尾手动插入getchar();
#include <stdio.h>
main()
{
int a;
int b;
b=0;
a=getchar();
while(a!=EOF)
{
if(a==' ')
{
if(b==0)
{
putchar(a);
b=1;
a=getchar();
}
if(b==1)
{
a=getchar();
}
}
if(a!=' ')
{
putchar(a);
b=0;
a=getchar();
}
}
}
当我编译和运行文件时,结果如下;
如果我打字
hello
我收到
hello
如果我打字
hello my name
我收到
hello my name
(这是正确的结果;当一个语句中有多个空格时,空格的数目将减少到一个。)。请注意每个单词之间有两个空格)
但是,如果我键入:
hello my name
我收到
hello y ame
我的问题是:
为什么空格后面的字母会被我的代码截断?
(代码可能太长,因为我只使用了在K&R一书中学习到的语法1.9)
最佳答案
一般的问题是,当您应该使用if
来处理其他情况时,您正在使用多个else
语句。例如,您有:
if(b==0)
{
putchar(a);
b=1;
a=getchar();
}
if(b==1)
{
a=getchar();
}
当
b
是0
时,执行第一个块,然后执行第二个块,因为第一个块确实b = 1;
。第二个块应该只是一个else
,所以它只在第一个块不存在时执行。同样的道理
if (a = ' ')
和
if (a != ' ')
因为您在第一个
a
块中重新分配if
。关于c - 在K&R 1-9中手动循环复制getchar(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42170620/