scanf注意事项

转载自 http://www.cnblogs.com/wshyj/p/6001354.html


每次调用完scanf后,记得调用一个getchar()函数

如下代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>


int main(int argc, char** argv) {
    long i = 0;
    int k = 0;
    char ch;
    k =scanf("%ld",&i);
    printf("%ld\n",i);
    ch = getchar();
    printf("%c\n",ch);
    return(EXIT_SUCCESS);
}
     用户其实是想读入一个整型数据后,再读入一个字符型数据,并在屏幕上打印,可是程序运行后可以发现,程序在要求用户输入一个整型的数据后,并没有继续要求用户输入一个字符型的数据,而是直接退出程序。 出现这种情况是因为scanf只会获得缓冲区中对自己有用的数据,至于回车换行,将不会将其从缓冲区中读出,这样就会影响下一个数据的输入,如果下一条读入的数据是非字符类型的倒无所谓,可是如果读入的是一个字符类型的数据,那反问题就来了,由于上一次读入,输出缓冲中余留有一个回车'\n‘符号,这时调用 getchar会直接返回,且返回的值为'\n‘,这样用户就不能正常得到数据,所以一定要记得在scanf后面加一条getchar语句来清空缓冲的回车符号。以上代码改为如下形式,就能达到要求了:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>


int main(int argc, char** argv) {
    long i = 0;
    int k = 0;
    char ch;
    k =scanf("%ld",&i);
    getchar();
    printf("%ld\n",i);
    ch = getchar();
    printf("%c\n",ch);
    return(EXIT_SUCCESS);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值