C++(六)— 输入方式
1、输入包含空格的字符串
使用 getline(cin, str)读取一行字符串,遇到换行符停止;cin>>str,是遇到空格就停止。
实现:输入两个字符,在第一个字符中删除第二个字符中出现的所有字符。
int main() { string str1; string str2; getline(cin, str1);//输入是“abc smd djndje” getline(cin, str2); map<char, int> m; for (int i = 0; i < str2.size(); ++i) m[str2[i]]++; for (int i = 0; i < str1.size(); ++i) { if (m.count(str1[i]) == 1) { str1.erase(i, 1); //这里删除后,索引要减一 i--; } } cout << str1; cout << endl; system("pause"); return 0; }
2、第一行输入数组长度,第二行数组
例:
3
1 2 3
cout << "please input the number of vector's element" << endl; int num; cin >> num; vector<int> v; int temp; for (int i = 0; i < num; ++i) { cin >> temp; v.push_back(temp); } for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; }
3、输入一组数,不知道长度,遇到回车结束
例:
1 2 3 回车
vector<int> v; int temp; while(cin>>temp) { v.push_back(temp); //等价于if (cin.get() == '\n') if (getchar() == '\n') //遇回车结束 break; } for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; }
4、输入一维数组,保存到 vector 中
例:
输入:[11,33,55,666]
输出:11 33 55 666
#include <vector> #include <string> #include <iostream> using namespace std; void SplitString(const string& s, vector<int>& v, const string& c) { int pos1=0, pos2; pos2 = s.find(c); while (string::npos != pos2) { v.push_back(stoi(s.substr(pos1, pos2 - pos1))); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length())//如果有最后一个数,将其加入到数组中 v.push_back(stoi(s.substr(pos1))); } int main() { string s = "[11,33,55,666]"; s = s.substr(1, s.size() - 2); vector<int> v; SplitString(s, v, ","); //可按多个字符来分隔; for (int i = 0; i < v.size(); ++i) cout << v[i] << " "; cout << endl; //输出: a b c d e f }
或者使用getline()函数
vector<int> stringToIntegerVector(string input) { vector<int> output; input = input.substr(1, input.length() - 2); stringstream ss; ss.str(input); string item; char delim = ','; while (getline(ss, item, delim)) { output.push_back(stoi(item)); } return output; } int main() { string line; while (getline(cin, line)) { //将输入的字符串转换为数组 // [1,2,3,4] -> 存入到 vector 数组中 vector<int> nums = stringToIntegerVector(line); int ret = Solution().maxProduct(nums);//你自己的计算函数 string out = to_string(ret); cout << out << endl; } return 0; }
5、上面4的另一种写法,输入字符,保存字符
区别:getline()的方法只能用单个字符来进行分割。getline每遇到一个行分割符都会返回一次,所以对于分割符连续的情况就束手无策了。
#include <vector> #include <string> #include <iostream> #include <sstream> using namespace std; void split(const string &s, vector<string> &v, char c) { stringstream ss; ss.str(s); string item; while (getline(ss, item, c)) { v.push_back(item); } } int main() { string line = "asd fasdf fadf fa"; vector<string> strs; split(line, strs, ' '); for (auto &s : strs) { cout << s << endl; } return 0; }
6、 输入二维数组,保存到vector矩阵中
例:
输入:[[1,2,3],[4,5,6]]
输出:保存到二维数组矩阵中
//[[1,3,1],[1,5,1],[4,2,1]] -> 保存到二维数组中 vector<vector<int>> stringToIntegerMatrix1(string input) { vector<vector<int>> output; vector<int> temp; input = input.substr(2, input.length() - 4); stringstream ss; ss.str(input); string item; char delim = '['; while (getline(ss, item, delim)) { item = item.substr(0, item.length() - 2); temp = stringToIntegerVector(item); output.push_back(temp); } return output; }
7、获取数组长度
#include<iostream> #include<stdio.h> //获取数组的长度 template<typename T> int count(T& x) { int s1 = sizeof(x); int s2 = sizeof(x[0]); int result = s1 / s2; return result; }
1、基本用法
最基本,也是最常用的用法。
//输入数字
int a, b;
cin >> a >> b;
cout << a << '\n' << b << '\n' << endl;
//输入abcds,输出 a ,只能获取一个字符
char ch;
ch = cin.get();
cout << ch << endl;
char ch1[10];
cin.get(ch1, 5);//输入 abcdefg,输出 abcd,还有一个保存‘\0’
cout << ch1 << endl;
//输入字符串,回车结束
string str;
cin >> str;
cout << str << endl;
区别:
(1)cin.get(arrayname,size)当遇到[enter]时会结束目前输入,他不会删除缓冲区中的[enter]
cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter]
/*
输入:12345[enter]
输出:12345 【换行】 10
说明:cin.get(a,10)把12345到a中,
遇到[enter]结束,但是不把[enter]删除,
则把[enter]输入到b中,(enter的ASCALL码为10)
*/
char a[10]; char b;
cin.get(a, 10);
cin.get(b);
cout << a << endl << int(b);
/*
输入:12345[enter]a[enter]
输出:12345【换行】97
说明:cin.getline(a,10)吧12345输入到a中,遇到{enter}结束,
并把缓冲区中[enter]删除,把接下来的a输入到b中
*/
char a[10]; char b;
cin.getline(a, 10);
cin.get(b);
cout << a << endl << int(b);
(2)cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除
cin.get(arrayname,size,s)当遇到s时会结束输入,但不会删除缓冲区中的s
/*
输入:12345,[enter]
输出:12345【换行】 ,
说明:cin,get不会删除缓冲区的,
*/
char a[10]; char b;
cin.get(a, 10, ',');
cin.get(b);
cout << a << endl << b;
/*
输入:12345,[enter]
输出:12345【换行】10
说明:cin.getline吧12345输入到a中,遇到’,
‘结束,并删除缓冲区的’,‘,后面的[enter]输入到b中
*/
char a[10]; char b;
cin.getline(a, 10, ',');
cin.get(b);
cout << a << endl << int(b);
应用举例:输入五个学生的名字,每个学生的名字不超过10个字符,输入时学生名字之间用逗号隔开,把这五个名字存储并换行输出
char a[5][10];
int i;
for(i=0;i<4;i++)
cin.getline(a[i],10,',');
cin.getline(a[i],10);
for(i=0;i<5;i++)
cout<<a[i]<<endl;