K&R 练习 1-9。 Putchar 和 getchar
K&R exercise 1-9. Putchar and getchar
我正在做这本书的练习 1-9(编写一个程序将其输入复制到输出,将一个或多个空格的每个字符串替换为一个空格),看来我不太明白它。到目前为止,这是我的代码:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF)
if (c == ' ') {
while (c == ' ') {
c = getchar();
}
putchar(' ');
} else {
putchar(c);
}
return 0;
}
这是错误的,因为 hey(blank)(blank)(blank)now
这句话变成了 hey ow
。始终删除最后一个空白后的第一个字母。我认为这是一个非常愚蠢的错误,但我看不出如何修复它。我会很感激任何建议。
PS: 对不起我的英语,如果你不明白什么,请告诉我。
因为 while (c == ' ')
正在读取直到找到 non-space。因此,当您到达 'n' 时它会停止,但您没有放置该字符。在putchar(' ')
之后加一个putchar(c);
,打印出一串空格后面的字符。
因为在内部 while 条件中得到 'n' 然后在外部 while 条件中得到另一个字符,即 'o'.
在此if语句中(我已将其格式化为可读)
if (c == ' ')
{
while (c == ' ')
{
c = getchar();
}
putchar(' ');
}
您正在跳过刚刚读取的 non-blank 字符,因为在外循环中
while ((c = getchar()) != EOF)
您正在阅读下一个字符。
程序可以写成下面这样的例子
#include <stdio.h>
int main( void )
{
int blank = 0;
int c;
while ( ( c = getchar() ) != EOF )
{
if ( !blank || c != ' ' ) putchar( c );
blank = c == ' ';
}
return 0;
}
考虑到根据 C 标准 main
没有参数应该声明为
int main( void )
我正在做这本书的练习 1-9(编写一个程序将其输入复制到输出,将一个或多个空格的每个字符串替换为一个空格),看来我不太明白它。到目前为止,这是我的代码:
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF)
if (c == ' ') {
while (c == ' ') {
c = getchar();
}
putchar(' ');
} else {
putchar(c);
}
return 0;
}
这是错误的,因为 hey(blank)(blank)(blank)now
这句话变成了 hey ow
。始终删除最后一个空白后的第一个字母。我认为这是一个非常愚蠢的错误,但我看不出如何修复它。我会很感激任何建议。
PS: 对不起我的英语,如果你不明白什么,请告诉我。
因为 while (c == ' ')
正在读取直到找到 non-space。因此,当您到达 'n' 时它会停止,但您没有放置该字符。在putchar(' ')
之后加一个putchar(c);
,打印出一串空格后面的字符。
因为在内部 while 条件中得到 'n' 然后在外部 while 条件中得到另一个字符,即 'o'.
在此if语句中(我已将其格式化为可读)
if (c == ' ')
{
while (c == ' ')
{
c = getchar();
}
putchar(' ');
}
您正在跳过刚刚读取的 non-blank 字符,因为在外循环中
while ((c = getchar()) != EOF)
您正在阅读下一个字符。
程序可以写成下面这样的例子
#include <stdio.h>
int main( void )
{
int blank = 0;
int c;
while ( ( c = getchar() ) != EOF )
{
if ( !blank || c != ' ' ) putchar( c );
blank = c == ' ';
}
return 0;
}
考虑到根据 C 标准 main
没有参数应该声明为
int main( void )