在程序员笔试当中,经常遇到ACM模式,会存在一些行数不固定的字符串,如下所示
//逗号分割
a,c,bb
f,dddd
nowcoder
//空格分割
12 3
45
0 0 0 0 0
每一行是一个string,以逗号分割子字符串。
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"
sstream定义了读写内存string对象的类型,头文件是 #include
。sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,也能从string读取数据。istringstream从string读取数据,ostringstream向string写入数据,而stringstream即可从string读取数据,也能向string写数据(也是后面用到的)。通过stringstream ss(s);
可以声明stringstream对象,保存string s的一个拷贝。
代码的主要逻辑是:读入一行,处理一行,根据逗号把字符串分割,然后存储进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);
}
主要是读入一行用的函数不一样。
//空格分割
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; //计算总和
}