《C程序语言设计》中练习1-10时碰到的一个关于for循环的问题(更深层的,回车对输入的影响问题)。

题目要求如下:

/* 练习 1-10. 写一个程序,将输入拷贝到输出,将每个制表符替换为\t,将每个空格替换为\b,
将每个反斜杠替换为\\。这使得制表符和空格能够被明确地分辨出来。*/

我的第一个程序如下:

#include <stdio.h>

int main()

{

int c;

for ( ;(c = getchar()) != EOF; c = getchar()){

/* 所以上面的程序大致是这样的:

输入1回车,测试1不是EOF,于是输出1。

输入12回车,测试1不是EOF,输出1,但c变成了2,然后又变成了回车,最终输出

1\n。

输入1234,测试1不是EOF,输出1,c变为2;但紧接着的输入3又把c变成3去测试,

依然不等于EOF,输出3,但再一次的输入4把c变成了4,最后输入回车去测试,

回车也不是EOF,最终的输出是13\n。

此时出现问题了。如果我接着在后面输入1234回车,会显示24;但是如果再按一次回车

换一个新行输入1234回车,依然是13\n。

*/

if (c == '\t')

printf("\\t");

else if (c == ' ')

printf("\\b");

else if ( c == '\\')

printf("\\\\");

else if (c == '\n')

printf("\\n");

else

putchar(c);

}

return 0;

}

碰到的问题大致如注释中所说:就是我现在就测试"1234回车",如果屏幕输出"13\n"后每次都换行继续输入"1234回车",那么程序表现正常。但一旦我不换行,在"13\n"后继续输入"1234回车",屏幕就会显示"24"——问题是我接着"24"继续输入"1234回车"时,又正常了。所以我感觉是回车影响的,但是想不出原因,因此求助。

图片描述

PS: win7系统,IDE为CodeBlocks 13.12。

改进后的第二个程序如下:

#include <stdio.h>

int main()

{

int c;

for (c = getchar(); c != EOF; c = getchar()){

if (c == '\t')

printf("\\t");

else if (c == ' ')

printf("\\b");

else if ( c == '\\')

printf("\\\\");

else if (c == '\n')

printf("\\n");

else

putchar(c);

}

return 0;

}

改进后的代码能够满足题目要求了,但是我就是不知道第一个程序错在哪里了。望各位帮助,谢谢了先~

回答:

你的输入:1234回车
第1遍循环:取到1并输出、跳过2
第2遍循环:取到3并输出、跳过4
第3遍循环:取到回车并输出,没有更多输入,c=getchar()等待

如果你接下来回车换行后再继续输入,这个换行符正好给了正在等待的c=getchar(),接下来再输入1又可以正常取到了。

如果你接下来直接输入1234回车,那么1将会被正在等待的c=getchar()获取到并被跳过,接下来取到并输出的就将是2

回答:

每执行一次getchar都会读取一个字符,在你原先的for循环中读两次才判断一次,自然有一次被漏了,改成while ( (c = getchar()) != EOF)也许你就更容易理解了

以上是 《C程序语言设计》中练习1-10时碰到的一个关于for循环的问题(更深层的,回车对输入的影响问题)。 的全部内容, 来源链接: utcz.com/p/195362.html

回到顶部