《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