OI中字符串讀入和處理

OI中字符串讀入和處理

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
相關文章
相關標籤/搜索