• 【C++】编程题遇到行数不固定的字符串(以逗号或空格分割)


    例题

    在程序员笔试当中,经常遇到ACM模式,会存在一些行数不固定的字符串,如下所示

    //逗号分割
    a,c,bb       
    f,dddd
    nowcoder
    
    //空格分割
    12 3       
    45
    0 0 0 0 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    每一行是一个string,以逗号分割子字符串。

    getline和cin的区别

    getline和cin都是可以读取字符串,但是cin读取字符串是以空格符、换行符、制表符为结束标志,getline是以换行符为读取标志。

    //以空格分割的一行字符串,“a1 b1 c1 d1”
    string s;
    cin>>s;				//读入第一个空格前面的字符串,“a1”
    getline(cin, s);	//读入一行,"a1 b1 c1 d1"
    
    //以逗号分割的一行字符串,“a1, b1, c1, d1”
    string s;
    cin>>s;				//读入一行,"a1, b1, c1, d1"
    getline(cin, s);	//读入一行,"a1, b1, c1, d1"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    sstream

    sstream定义了读写内存string对象的类型,头文件是 #include。sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,也能从string读取数据。istringstream从string读取数据,ostringstream向string写入数据,而stringstream即可从string读取数据,也能向string写数据(也是后面用到的)。通过stringstream ss(s); 可以声明stringstream对象,保存string s的一个拷贝。

    解决办法

    1.逗号分割的字符串

    代码的主要逻辑是:读入一行,处理一行,根据逗号把字符串分割,然后存储进vec数组里面,至于要装在一个数组还是多个数组,都可以自己更改。

    因为字符串是不固定行的,所以需要借助while循环读取,每个循环就是读取一行。注意前面包含的三个头文件。

    //逗号分割
    a,c,bb       
    f,dddd
    nowcoder
    
    #include
    #include
    #include
    string line;
    while (cin>>line){	//读入一行
        stringstream ss(line);                              
        string str;
        vector<string> vec;
        while(getline(ss, str,','))   //把字符串以逗号分开,读取每个string
            vec.push_back(str);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.空格分割的字符串

    主要是读入一行用的函数不一样。

    //空格分割
    12 3       
    45
    0 0 0 0 0
    
    #include
    #include
    #include
    string line;
    while(getline(cin,line)) {	 //依靠geline读入一行
       stringstream ss(line);    //每行先读入字符串,然后再区分每个数字
        int num;
        int sum=0;		
        while(ss>>num)
           sum += num;			//计算总和
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    【算法集训专题攻克篇】第二十篇之二叉搜索树
    生成对抗网络 GAN——Generative Adversarial Nets
    C语言快速入门之内存函数的使用和模拟实现
    眼镜清洗机什么牌子比较好?适合洗眼镜的超声波清洗机推荐
    【第十六篇】商城系统-认证系统构建
    【打靶】vulhub打靶复现系列3---Chronos
    智能运维|AIRIOT智慧光伏管理解决方案
    linux如何抓包数据
    (九)Java算法:快速排序(详细图解)
    Java基础(二十)Stream练习
  • 原文地址:https://blog.csdn.net/wuwenbin12/article/details/126382811