简单小疑点

简单小问题

        大家试运行一下下面这个简单的小程序,在我还没输入字符串的时候就结束运行了。我知道可以在scanf( "%d ",&i);后面加上getchar();语句来解决这个问题。但是我想知道
(1)原程序为什么在没输入字符串的时候就结束运行
(2)为什么在提示的地方放上getchar();可以运行,而放在别的地方不行?例如放     在gets(b);后
void   main()
{
        int   i   =   0;
        char   b[20];

        scanf( "%d ",&i);

  //此处加上getchar();语句来解决这个问题
     
        if(i   ==   1)
        {
printf( "enter   the   name   of   the   book: ");
gets(b);

                  printf( "%s\n ",b);

        }
        else
        {
                printf( "----------------------------------------------- ");
        }
        return;
}


------解决方案--------------------
道理其实很简单,楼上说的也很对。
getchar()的作用是向缓存中输入一个字符。它一般用于清空一个回车符,就像你的这个题一样,清空回车后就可以让gets()读取自己的数据流,否则gets()将scanf()后的回车读取就直接跳出了。
在scanf()中,遇到一下情况认为这个数据输入结束:
1、空格、回车或tab键
2、按指定的宽度结束
3、遇到非法输入
所以在你这个情况下,scanf后的回车只表示输入的结束,而没有将回车读入scanf中,所以回车被留到gets里了,gets遇到回车就自然跳出了!


呵呵,其实我是一个刚刚接触走出校园,参加工作的职场新人,很多东西都不会,以上的观点是我这段时间来的积累,希望对你有所帮助,在我看来,输入输出在c的学习和实际工作中是十分有必要的,好好学!
------解决方案--------------------

scanf( "%d ",&i);

//此处加上getchar();语句来解决这个问题

if(i == 1)
-------------------------------------------
不是只能加在这里,getchar()只要加在gets()前面的任何地方都行!目的就是把键盘输入流(stdin)里面的回车符清除,免的被gets读到(gets的作用是:从标准输入流读取字符串并回显,读到回车符时退出),当然也可以用更直接的清除输入流的函数fflush(stdin)来解决。