zoukankan      html  css  js  c++  java
  • 关于scanf()函数的一点理解

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

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

    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前面留个空格))

  • 相关阅读:
    DbUtil组件及C3P0数据库连接池组件的使用
    servlet过滤器
    JDBC实现往MySQL插入百万级数据
    学会怎样使用Jsp 内置标签、jstl标签库及自定义标签
    一种c#深拷贝方式完胜java深拷贝(实现上的对比)
    JSP三个指令及9个内置对象
    java web工程的错误页面的简单配置
    理解java Web项目中的路径问题
    web应用程序servlet的映射名称的规则及请求过程
    tomcat上servlet程序的配置与处理servlet请求过程
  • 原文地址:https://www.cnblogs.com/mlgjb/p/5668000.html
Copyright © 2011-2022 走看看