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

《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)也许你就更容易理解了

【热门文章】
【热门文章】