Standard Input in CPE
Perface
寫了一個上午的Parser,決定換個心情寫個網誌,順便把自己會用到的CPE基本輸入做一下整理。
Table
- cin
- cin.getline()
- getchar()
- getline()
- String sample introduction
1. cin
最基本的輸入法,會省略空白跟換行等跳脫字元。
Example:
Data Input:
1 2 3
Porgram
Output:
1
2
3
4
2. cin.getline()
Reference 中是這麼寫的
istream& getline (char* s, streamsize n, char delim );
第一個參數 *s 是用來接字元指標的, 第二個 n 則是確認指標陣列長短
第三個delim則是對每一行斷點的定義,預設是 ‘\n’ 也就是換行
Example:
Data Input:
1 2 3
4 5 6 7 8 abc
GgiNinDer
Porgram
Output:
1 2 3
4 5 6 7 8 abc
GgiNinDer
如果我們在最後一個參數填入’i’則會在讀到i時停止。
Output:
1 2 3
4 5 6 7 8 abc
Gg
N
nDer
3. getchar()
我只有在cin 和其他輸入混合使用時會用到,主要應用在把cin沒有吃掉但會影響getline的’\n’吃掉。
可以參考:“How to use StringStream(sstream) in C++ STL (UVA:482)”中程式碼第13行和15行,此處不再贅述。
4. getline()
並不是iostream裡面的東西,使用時要include string。
Example:
Data Input:
1 2 3
4 5 6 7 8 abc
GgiNinDer
Porgram
Output:
1 2 3
4 5 6 7 8 abc
GgiNinDer
5. String sample introduction
重點在這裡XD
主要是把早上寫的Parser裡用到做法整理一下。
不過大部分還是從 Cplusplus 搬運的就是了~
Function Name | Introduce |
---|---|
operator+ | Concatenate strings |
operator[] | Get character of string |
size | Return length of string |
begin | Return iterator to beginning |
end | Return iterator to end |
c_str | Get C string equivalent |
find | Find content in string |
substr | Generate substring |
Explain:
- Operator+
可以將兩個字串相加,我個人比較常用到+=,這樣有相當於Push_back的效果 - operator[]
字串也可以當成字元陣列,用法和Array的[]是相同的意思 size
12string str ="Test string";cout << "The size of str is " << str.size() << " bytes.\n";Output:
The size of str is 11 bytesc_str()
會將字串拆開成字元,我通常會搭配 cstdlib Libery的atoi 做型別轉換 會把string轉換成int。123string str="1234567";int i=atoi(str.c_str());cout << i << "\n";Output:
1234567find
總共有三個參數,第一個是char陣列或者string的Pointer or Reference第二個是搜尋開始的位置,第三個則是C 陣列的問題所以需要的陣列長度,如果第一個參數是string相關的就可以不用管了,至於Example我懶得想例子所以直接搬運了 ~(OAO)~
出處:Cplusplus std::string::find1234567891011121314151617181920212223string str ("There are two needles in this haystack with needles.");string str2 ("needle");// different member versions of find in the same order as above:size_t found = str.find(str2);if (found!=string::npos)cout << "first 'needle' found at: " << found << '\n';found=str.find("needles are small",found+1,6);if (found!=string::npos)cout << "second 'needle' found at: " << found << '\n';found=str.find("haystack");if (found!=string::npos)cout << "'haystack' also found at: " << found << '\n';found=str.find('.');if (found!=string::npos)cout << "Period found at: " << found << '\n';// let's replace the first needle:str.replace(str.find(str2),str2.length(),"preposition");cout << str << '\n';Output:
second ‘needle’ found at: 44
‘haystack’ also found at: 30
Period found at: 51
There are two prepositions in this haystack with needles.substr
string substr (size_t pos = 0, size_t len = npos) const;
第一個參數是起點,第二個是子字串長度。
範例出處:Cplusplus std::string::substr123456789string str="We think in generalities, but we live in details.";// (quoting Alfred N. Whitehead)string str2 = str.substr (3,5); // "think"size_t pos = str.find("live"); // position of "live" in strstring str3 = str.substr (pos); // get from "live" to the endcout << str2 << ' ' << str3 << '\n';Output:
think live in details.其實還有一個偷懶的方法,比如今天有一個字串叫M17394,假設我只要需要面數字的部分,那麼可以直接用下列方法
12string k="M17394";string k2(k.begin()+1,k.end());不過這樣相當缺乏彈性,除非測資相當固定,不然還是用find_first_not_of 和 find_first_of 等string 裡面其它memeber function會比較好。