zoukankan      html  css  js  c++  java
  • C++字符串的输入输出整理

    最近在跟一门北大C++程序设计的慕课,openjudge上做到一道题,要求定义一种能够输入输出学生姓名,年龄,学号和学年成绩的类。比较特别的是输入的形式是以逗号隔开的一长串字符串。

    我用的方法通过是通过了,但可能比较笨,主要使用getline获取指定字符之前的字符串,使用强制转换函数stoi()转换成数字。

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cstring>
    #include <sstream>
    #include <cstdlib>
    using namespace std;
    
    class Student {
    private:
        string m_name, m_id;
        unsigned m_age;
        double m_av, n[4];
    
    public:
        void input()
        {
            string ts = {};    
            getline(cin, m_name, ',');    //从流中获取姓名的字符串,遇到逗号结束
            getline(cin, ts, ',');    //从流中获取年龄的字符串
            m_age = stoi(ts);    //强制转化为整型赋给成员变量m_age
            getline(cin, m_id, ',');    //从流中获取学号的字符串,赋给成员变量m_id
            for (int i = 0; i < 3; i++)    //获取前三个学年的成绩,同样用强制转换存值
            {
                getline(cin, ts, ',');
                n[i] = stoi(ts);
            }
            getline(cin, ts, '
    ');    //获取最后一个学年的成绩,遇到换行符结束
            n[3] = stoi(ts);    
        }
        void calculate()
        {
            m_av = (n[0] + n[1] + n[2] + n[3]) / 4;    //计算四个学年成绩的平均值
        }
        void output()
        {
            cout << m_name << "," << m_age << "," << m_id << "," << m_av;
        }
    };
    
    int main() {
        Student student;        // 定义类的对象
        student.input();        // 输入数据
        student.calculate();    // 计算平均成绩
        student.output();       // 输出数据
    
        system("pause");
        return 0;
    }

    这里总结一下我迄今使用的字符串输入输出的方式。

     

    1.cin

    cin会从流中取数据,遇到空格或者换行符都会停止,所以不适合读数据串。一般用来取单个变量的数据。

    int a; int b;
        cin >> a;
        cin >> b;
        cout << "a:" << a << endl;
        cout << "b:" << b << endl;

    输入:

    2 3(回车)

     

    2(回车)
    3(回车)

    输出:

    a:2
    b:3

    第一种输入会把换行符之前,即“2+空格+3+ ”的数据都存入缓冲区。程序执行到cin>>a,去缓冲区取数据,碰到空格停止,所以就取走了一个2赋给了a,然后继续执行cin>>b,此时缓冲区如果还残留数据,程序会从缓冲区取数据而不是要求用户输入,所以重复相同的步骤取走了剩余的3。最后,留下一个换行符在缓冲区内

    2.cin.get()

    cin.get()如果不加任何参数的话,只会每次从缓冲区取一个数据,同样也会留下换行符。要注意的是,cin.get()遇到换行符就会停止,意思是缓冲区如果留有换行符,此时程序执行cin.get()会被直接跳过。cin.get()返回的值可以直接赋给变量。

    int a; int b;
        a = cin.get();
        b = cin.get();
    
        cout << "a:" << a << endl;
        cout << "b:" << b << endl;

    输入:

    abc(回车)

    输出:

    a:97
    b:98

    发现cin.get()取的实际是单个字符,如果赋给整型的话就会转化成对应的ASCII值。

    再如:

    char a, b;
        cin >> a;
        b = cin.get();
    
        cout << "a:" << a << endl;
        cout << "b:" << b << endl;

    输入:

    1(回车)

    输出:

    a:1
    b:

    刚才说过cin>>a读取了回车之前的数据给了a,但会缓冲区留下个换行符。然后cin.get()从缓冲区取数据,遇到换行符直接就跳过了,所以没有提示用户输入,b没有赋值。

    如果不把cin.get()的返回值赋给谁,自成一句,那么cin.get()就可以用来清除掉缓冲区的字符

    如:

    char a[10];
    
        a[0] = cin.get();
        a[1] = cin.get();
        cin.get();
        cin.get();
        a[2] = cin.get();
    
        cout << a[0] << a[1] << a[2] << endl;

    输入:

    abcde

    输出:

    abe

    cd被推走了,所以只有abe赋了值。

    利用这一特性,常留一句cin.get()清掉缓冲区残留的换行符,或者无效的输入。

    cin.get()加参数的话,第一项填数据名,第二项填其长度,就可以给特定字符变量输入字符串了。

    如:

    char a[10];
    cin.get(a,10);

    3.getline

    getline可以给字符串string对象赋值,用法如下:

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main()
    {
        char str1[10];
        string str2;
    
        cin.get(str1, 10);
        cin.get();    //清除换行符
        getline(cin,str2);
    
        cout << "str1:" << str1 << endl;
        cout << "str2:" << str2 << endl;
        
        system("pause");
    }

    输入:

    abcd(回车)
    hijk(回车)

    输出:

    str1:abcd
    str2:hijk

    getline可以指定第三项参数,即遇到特定的字符停止,默认是‘ ’,可以手动写成如‘,’,也就是我在上面例题程序里使用的。

    值得注意的是将string转换成int的函数 stoi() 还是挺有用的,需要包含头文件<string>。

    string str;
        int a ;
        cin >> str;
        a = stoi(str);
    
        cout << "a:" << a << endl;

    输入:

    100(回车)

    输出:

    a:100
  • 相关阅读:
    促仅开发者间交流与合作的胡思乱想
    Unity3D音乐音效研究-MIDI与波表
    剑英陪你玩转图形学 (二)彩虹
    java mail实现Email的发送,完整代码
    linux 下 安装 rpm 格式 的 mysql
    ExtJs3带条件的分页查询的实现
    查看linux的版本信息
    java 非法字符过滤 , 半角/全角替换
    MySQL数据库错误server_errno=2013的解决
    MySQL数据库双机热备份
  • 原文地址:https://www.cnblogs.com/banmei-brandy/p/11384271.html
Copyright © 2011-2022 走看看