https://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html里面介绍了多种从键盘输入的函数的用法。如输入字符串分隔符可用
getline(cin, str, ',');
设置
0、简单的输入固定几个数字,但是又用非空格隔开,可以利用cin轻松解决
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int a1, a2, a3;
//简单输入3个由空格或者换行符或者tab空字符隔开的数字
cin >> a1 >> a2 >> a3;
int b1, b2, b3;
//要输入的3个数字要求用其他字符隔开。
//此方法只适合用于数字间用一个其他字符隔开,多了就不行了。可用先输入保存字符串再替换字符为空格的做法。
char ch;
cin >> b1 >> ch >> b2 >> ch >> b3;
cout << a1 << " " << a2 << " " << a3 << endl;
cout << b1 << " " << b2 << " " << b3 << endl;
return 0;
}
1、循环输入未知个数的int,空格和换行符会跳过,用vector保存。遇到其他字符会停止循环输入
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
vector<int> v_n;
//用while循环读入未知个数的int数字,会跳过空格和换行符,遇到其他字符会结束循环
while (cin >> n)
{
v_n.push_back(n);
}
for (int i : v_n)
{
cout << i << " ";
}
return 0;
}
2、将输入的字符串中的其他分隔字符都转换成空格,然后将新的字符串再作为一次输入(用到头文件<sstream>中的stringstream类)类对象,再用用while循环读入未知个数的int,直到非数字和空格才结束。
//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
struct part
{
int num1;
int num2;
part(int i, int j) :num1(i), num2(j){}
bool operator<(part &p)
{
return num1 < p.num1;
}
};
int main()
{
int m;
cin >> m;
vector<part> vp;
//输入m后的一个换行符会影响下面的一次读入,所以可以将下面的循环多加一次,但要注意没有用到i
for (int i = -1; i < m; i++)
{
string str;
getline(cin, str); //只会根据换行符停止接收输入
//将str中的,;字符都换成空格
int pos = 0;
while (pos != string::npos)
{
pos = str.find(',', pos); //未找到时会返回string::npos
if (pos != string::npos)
{
str[pos] = ' ';
pos = str.find(';', pos);
if (pos != string::npos)
{
str[pos] = ' ';
}
}
}
stringstream in_str(str); //将字符串重新作为输入,要引入头文件<sstream>
vector<int> vtemp;
int tmp;
//处理不定个数的数字输入
while (in_str>>tmp)
{
vtemp.push_back(tmp);
}
for (int j = 0; j < vtemp.size(); j+=2)
{
vp.push_back(part(vtemp[j], vtemp[j + 1]));
}
}
cout << "输出" << endl;
for (auto v : vp)
{
cout << v.num1 << " " << v.num2 << endl;
}
return 0;
}
3、要从一串输入的字符串中分割出各个数字
如图,输入3行由逗号和分号还有换行符分隔的数字字符串,要将每对逗号分隔的数字存放在一起,再放入vector中。重点是用到C语言的<string.h>中的strtok_s(win下开发)或者strtok_r(linux下开发),来做分割。
//#include<bits/stdc++.h>
#include<iostream>
#include<vector>
#include<string>
#include<string.h>
using namespace std;
struct part
{
int num1;
int num2;
part(int i, int j) :num1(i), num2(j){}
bool operator<(part &p)
{便于给容器中该类元素排序
return num1 < p.num1;
}
};
int main()
{
int m;
cin >> m;
vector<part> vp;
//输入m后的一个换行符会影响下面的一次读入,所以可以将下面的循环多加一次,但要注意没有用到i
for (int i = -1; i < m; i++)
{
char cstr[1024];
cin.getline(cstr, 1024);
char *save;
char *p = strtok_s(cstr, ",;", &save);
vector<int> vtemp;
while (p)
{
int num = atoi(p);
vtemp.push_back(num);
p = strtok_s(NULL, ",;", &save);
}
for (int j = 0; j < vtemp.size(); j+=2)
{
vp.push_back(part(vtemp[j], vtemp[j + 1]));
}
}
cout << "输出" << endl;
for (auto v : vp)
{
cout << v.num1 << " " << v.num2 << endl;
}
return 0;
}