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

关于scanf()函数的一点理解

时间:2016-07-14 01:14:02      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

       习惯了c++的cin.cout之后,也不怎么关注空格,反正cin.cout会自动处理。有一次实验,创建Huffman树,要求输入空格字符,当时就懵逼了.cin咋输入空格呢?

没办法,只能重新用scanf函数了,结果各种悲剧,足足debug一个多小时,这难道就是越学越差劲系列?o(╯□╰)o

          scanf()和printf()严格来说并不是c的一部分,当我们用scanf()函数输入数据时,只要不回车,数据就暂存在缓冲区。因此我们可以输入一下

回车一下,也可以全部输完再回车,一般来说这两者没啥区别,但遇到字符输入时就需要格外注意了。

 比如输入空格和数字

 空格 12(空格的ASCII码值为32)

代码:

#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
    char a;
    int b;
    scanf("%c %d",&a,&b);
    cout<<(int)a<<endl;
    cout<<b<<endl;
    return 0;
}

技术分享

输入空格和12,然后回车,这显然没什么问题

在这基础上,我们做一下改动

#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
    char a,a1;
    int b,b1;
    scanf("%c %d",&a,&b);
    scanf("%c %d",&a1,&b1);
    cout<<(int)a<<endl;
    cout<<b<<endl;
    cout<<a1<<endl;
    cout<<b1<<endl;
    return 0;
}

当我们输入a,b后,能不能回车,再输入a1,b1.答案是不能,因为回车被a1给吸收了(o(╯□╰)o)(大一的时候对着明明很清楚的诶,咋忘了呢?)

我们再来做一下改动,我们不想写多个scanf(),改为for循环控制

代码:

#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
    char a;
    int b;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    scanf("%c %d",&a,&b);
    cout<<(int)a<<endl;
    cout<<b<<endl;
    }
    return 0;
}

大家可能觉得这没什么问题,但输入n之后回车的话,就会悲剧,所以需要在cin>>n后加一个getchar();同时scanf()也要加一个getchar();

正确的代码:

#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
    char a;
    int b;
    int n;
    cin>>n;
    getchar();
    for(int i=1;i<=n;i++){
    scanf("%c %d",&a,&b);
    getchar();
    cout<<a<<endl;
    cout<<b<<endl;
    }
    return 0;
}

技术分享

(ps:嘛,事实上可以用scanf(" %c",&a))这种形式吸收空格和回车(%c前面留个空格))

   还有求各位juju不要喷本弱鸡(o(╯□╰)o)

关于scanf()函数的一点理解

标签:

原文地址:http://www.cnblogs.com/mlgjb/p/5668000.html

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