您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++ stringstream格式化輸出輸入分析”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++ stringstream格式化輸出輸入分析”吧!
最近在筆試時經常遇見各種輸入問題,于是細心總結一波;首先string str; cin>>str;遇到空格結束;于是乎產生了getline(),可與得到一行字符串;空格自動去掉,只要不講cin和getline混用即可
cin.getline(s,k);
接收一行中k
個字符,可以接收空格
cin.getline()
實際有三個參數,cin.getline
(字符串,接收個數,結束字符);
當第三個參數省略時,系統默認為 '\0'
;
getline(cin,s);
和cin.getline()
類似,讀入一行字符串,值得注意的是cin.getline()
屬于istream
流,而getline()
屬于string
流,二者并不相同。
StringStream
這個東西單獨講,比較重要,包含在sstream
庫中。
istringstream
類用于執行C++風格的串流的輸入操作。
ostringstream
類用于執行C風格的串流的輸出操作。
stringstream
類同時可以支持C風格的串流的輸入輸出操作。
然后stringstream
的作用就是從string
對象讀取字符或字符串。
string s = "ABCD"; stringstream ss(s); char ch; while(ss>>ch){ cout << ch << " "; } //運行結果 //A B C D
又例如:
string s = "hello world"; stringstream ss(s); string str; while(ss>>str){ cout << str << " "; } //運行結果 //hello world
在某些題目需要處理字符串時,這些題目往往是輸入的一行中包含多個字符以及空格,這個時候就可以利用 stringstream進行單個字符或者單個字符串分析處理了
例子程序:
int main() { string line; int k = 1; cout << "===============case1================" << endl;; while (getline(cin, line)) //可與讀到包含空格, ;等字符;但是在ss>>x時被截斷 { int sum = 0, x; stringstream ss(line); while (ss >> x) { sum += x; } cout << "the sum is :" << sum << endl; ++k; cout << endl; cout << "===============case" << k << "================" << endl;; } return 0; }
-輸出:
===============case1================
1 2 3 4 5
the sum is :15===============case2================
1,2,3,4,5
the sum is :1===============case3================
1 a 2 b 3
the sum is :1===============case4================
a 1 1 1 1
the sum is :0===============case5================
另外一組:
int main() { string line; int k = 1; cout << "===============case1================" << endl;; while (getline(cin, line)) { string out, x; stringstream ss(line); while (ss >> x) { cout << x << ";"; } ++k; cout << endl; cout << "===============case" << k << "================" << endl;; } return 0; }
輸出:
===============case1================
this is very good!
this;is;very;good!;
===============case2================
this,is,very,good!
this,is,very,good!;
===============case3================
實驗矩陣類型的輸入:
3
0 1 2
2 3 4
5 6 7
int main() { string line; int k = 1; //測試矩陣形式的輸入: string input; int n; //cin >> n; //輸入n行數據,如果后面用getline()后面的換行符不能處理 getline(cin, input); stringstream ss(input); ss >> n; vector<vector<int> > vec; for (int i = 0; i < n;i++) { getline(cin,input); //會將換行符當做一行 stringstream ss(input); int x; vector<int> temp; while (ss>>x) //只能以空格處理分離 { temp.push_back(x); } vec.push_back(temp); } return 0; }
使用方法:
input1是沒有空格的,帶有,;將矩陣的行列分出來;
但是使用cin>>k后,沒有使用getline(input1), 應為input1本身是沒有空格的字符串
經上面啟發:練習這樣的輸入:
3 3
0,1 0,2;0,0 1,0;0,1 1,1;0,2 1,2;1,0 1,1;1,1 1,2;1,1 2,1;1,2 2,2;2,0 2,1
測試代碼:
int main() { string line; int k = 1; int row, col; getline(cin, line); stringstream ss(line); ss >> row >> col; getline(cin, line); //第二行 stringstream s(line); string temp1, temp2, temp3;; vector<pair<pair<int,int>,pair<int,int>>> vec; while (getline(s, temp1, ';')) { vector<pair<int, int>> pair1; stringstream s3(temp1); while (getline(s3, temp2,' ')) //以換行符結束,中間為空格 { pair<int, int> pair2; stringstream s4(temp2); vector<int> res; while (getline(s4, temp3, ',')) { res.push_back(stoi(temp3)); } pair2.first = res[0]; pair2.second = res[1]; pair1.push_back(pair2); } vec.push_back(make_pair(pair1[0],pair1[1])); } return 0; }
輸出:
另外參考輸入遇到過問題題解:
5 0 1 2 3 0 4 0 4 0 4 1 2 3 int main() { int N, id; string str; getline(cin, str); stringstream ss(str); ss >> N >> id; vector<vector<int>> vec; //for (int i = 0; i < N; i++) //{ // vector<int> temp; // int user; // getline(cin, str); // stringstream s(str); // while (s>>user) //以空格進行劃分 // { // temp.push_back(user); // } // vec.push_back(temp); //} while (getline(cin, str)) //其實可都可以不知道行數 { vector<int> temp; int user; stringstream s(str); while (s >> user) { temp.push_back(user); } vec.push_back(temp); } cout << recommendFriends(vec, id) << endl; return 0; } int test() { //int N,id; //cin >> N >> id; //直接輸入用戶數和需要查找的用戶id ; 這樣就會產生換行符 int N; vector<int> in; char c; while ((c = cin.get()) != '\n') { cin.unget(); cin >> N; in.push_back(N); } vector<vector<int>> vec; for (int i = 0; i < in[0]; i++) { vector<int> temp; int user; while ((c=cin.get())!= '\n') //文件結果沒有換行符了,所以陷入死循環 { cin.unget(); cin >> user; temp.push_back(user); } if (temp.size()!=0) { vec.push_back(temp); } } cout << recommendFriends(vec, in[1]) << endl; return 0; }
全部代碼:
#include <iostream> #include <algorithm> #include <vector> #include <unordered_map> #include <unordered_set> #include<sstream> #include<fstream> using namespace std; #define cin infile //一定不能再oj系統中,有錯,導致超時等!!! //C++文件輸入 ifstream infile("ini.txt", ifstream::in); //函數功能:將輸入字符串s,以字符串c(;)進行拆分,拆分結果放在v中 //函數參數說明:s為輸入字符串;c為拆分的字符串;v為拆分結果 //函數返回值:正常返回0 int split_string(const std::string& s, std::vector<std::string>& v, const std::string& c) { std::string::size_type pos1, pos2; pos2 = s.find(c); pos1 = 0; while (std::string::npos != pos2) { v.push_back(s.substr(pos1, pos2 - pos1)); pos1 = pos2 + c.size(); pos2 = s.find(c, pos1); } if (pos1 != s.length()) v.push_back(s.substr(pos1)); return 0; } int main() { string line; int k = 1; /*cout << "===============case1================" << endl;; while (getline(cin, line)) { int sum = 0, x; stringstream ss(line); while (ss >> x) { sum += x; } cout << "the sum is :" << sum << endl; ++k; cout << endl; cout << "===============case" << k << "================" << endl;; }*/ //cout << "===============case1================" << endl;; //while (getline(cin, line)) //{ // string out, x; // stringstream ss(line); // while (ss >> x) // { // cout << x << ";"; // } // ++k; // cout << endl; // cout << "===============case" << k << "================" << endl;; //} ////測試矩陣形式的輸入: //string input; //int n; ////cin >> n; //輸入n行數據,如果后面用getline()后面的換行符不能處理 //getline(cin, input); //stringstream ss(input); //ss >> n; // //vector<vector<int> > vec; //for (int i = 0; i < n;i++) //{ // getline(cin,input); //會將換行符當做一行 // stringstream ss(input); // int x; // vector<int> temp; // while (ss>>x) //只能以空格處理分離 // { // temp.push_back(x); // } // vec.push_back(temp); //} int row, col; getline(cin, line); stringstream ss(line); ss >> row >> col; getline(cin, line); //第二行 stringstream s(line); string temp1, temp2, temp3;; vector<pair<pair<int,int>,pair<int,int>>> vec; while (getline(s, temp1, ';')) { vector<pair<int, int>> pair1; stringstream s3(temp1); while (getline(s3, temp2)) //以換行符結束,中間為空格 { pair<int, int> pair2; stringstream s4(temp2); vector<int> res; while (getline(s4, temp3, ',')) { res.push_back(stoi(temp3)); } pair2.first = res[0]; pair2.second = res[1]; pair1.push_back(pair2); } vec.push_back(make_pair(pair1[0],pair1[1])); } return 0; }
感謝各位的閱讀,以上就是“C++ stringstream格式化輸出輸入分析”的內容了,經過本文的學習后,相信大家對C++ stringstream格式化輸出輸入分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。