码迷,mamicode.com
首页 > 其他好文 > 详细

while循环中使用scanf函数

时间:2017-05-26 00:43:44      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:top   用户输入   war   otto   标准   输入数据   代码   循环   root   

妈的,这scanf函数学了快10年了,怎么还会出现莫名其妙的问题?看下面的代码(VS2012环境下运行):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    char root_value = \0;
    int i =1;
    while (i!=5)
    {
        printf("输入:");
        scanf("%c",&root_value);//用户输入节点
        i++;
    }
    
    printf("输入:%c\n",root_value);
}

本意是每次循环读取一个字符,结果在VS2012里面运行,运行结果莫名其妙:第一次循环输入字符a,然后回车,进行下一次输入,结果屏幕直接输出两个“输入:输入:“。原来scanf把回车也当作一个字符读入了。

原因是因为scanf()函数会把回车、空格、Tab或一些非法输入的字符当作此次输入的结束标志,它不会把这些字符输入到想要保存此次输入数据的变量中,而是把这些字符遗留在了输入缓冲区,那么,当下一次想要从标准输入中读取一个字符时,这个遗留的字符就正好充当了此次的输入字符。
显而易见,程序在输入abcdefg之后,输入了回车来结束此次输入,那么回车就遗留在了输入缓冲区,当需要给c输入字符时,它自动的充当了输入的字符,因此,程序没有给我们输入c的字符的机会。(通过输出abcdefg之后又两个空行(残留在输入缓冲区和输出的两个回车导致的)也可以验证)

C语言为了解决这种问题,为我们提供了一种很方便的清空输入缓冲区的方式—->>fflush()函数,它会把残留在输入缓冲区里的所有数据清空

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
    char root_value = \0;
    int i =1;
    while (i!=5)
    {
        printf("输入:");
        scanf("%c",&root_value);//用户输入节点
        fflush(stdin);
        i++;
    }
    
    printf("输入:%c\n",root_value);
}

while循环中使用scanf函数

标签:top   用户输入   war   otto   标准   输入数据   代码   循环   root   

原文地址:http://www.cnblogs.com/VIPler/p/6906434.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!