在NOIP
的「大模擬」題中,每每要對字符串進行讀入並處理,這些字符串有可能包含空格並以\n做爲分割,傳統的cin >>
scanf()
等等,不可能達到要求,由於這些都是以\n
space
(空格) \t
(Tab) \r
做爲分割符。ios
因此要處理字符串輸入時,要以getline()
做爲輸入,輸入後構造爲【字符串流】,而後能夠進行【分割】後進行任意處理。這是比較通用的作法,幾乎能夠適應全部狀況。c++
#include<vector> #include <sstream> #include <iostream> //分割爲【單詞】後進行處理,這是最通用的辦法。 void Split(string &line, vector<string> &words) { string word; //這個是in string stream 須要#include<sstream>,而後就能夠用相似於 cin>>的方式任意處理了。 istringstream iss(line,istringstream::in); while (iss >> word) { words.push_back(word); } } int main() { string lines ; //讀入一行,可能會在結尾有\r,但不會包含\n, std::getline(cin, lines); //刪除最後的 \r 若是要split的話,則可不調用 lines.erase(lines.find_last_of("\r")); vector<string> words; //分割爲每一個單詞 Split(lines,words); for (int i = 0; i < words.size(); i++) { cout << words[i] << endl; }
函數名稱 | 說明 |
---|---|
getline(cin,string) |
從「流」中讀入一行,讀到\n 爲止,有可能包括\r |
string::c_str() |
把 string 轉換爲 char * ,經常使用於轉換後,再次轉換爲 int double 等 |
string::erase(pos = 0, len = npos); |
從pos 開始刪除len 個字符,若是len 【缺省】,則刪除到尾。 |
string::empty() |
string 是否爲空? |
string::length() string::size() |
string 的長度,這兩個是同樣的。 |
string::find(str,pos = 0) |
【字符串】(字符查找須要用find_first_of )查找,默認從0開始 |
string::rfind(str,pos = npos) |
從右邊查找 |
string::substr(pos = 0,len = npos |
獲取子串,若是省略len ,就從pos 一直到結尾 |
string::replace(pos,len,str2); |
替換,把從pos開始,長度爲len的部分替換爲str2 |
下面的函數查找的是字符而不是字符串函數
函數名稱 | 說明 |
---|---|
string::find_first_of(string& str, pos = 0) |
字符查找(沒有串),str 中任一匹配就算找到 |
string::find_last_of(string& str, pos = 0) |
從後往前找 |
在c++98
中是不能直接從string
轉換爲其餘類型的(c++11
就能夠),因此若須要轉換則首先須要經過c_str()
轉爲爲char *
而後進行轉換。spa
函數名稱 | 說明 |
---|---|
strtol (char* str, char** endptr, int base) |
轉換爲base 進制的整形,endptr 爲【轉換】後【剩下】的,即沒有轉換成功的字符串, 能夠爲 null |
strtoll (char* str, char** endptr, int base) |
轉換爲base 進制的long long |
strtod(char* str, char** endptr); |
轉換爲double ,endptr 能夠爲 null |
strtold(char* str, char** endptr); |
轉換爲long double |