C++的getline()函數

首先,C++字符串的輸入方式如下

// C風格字符串
char info[100];
cin >> info;
cin.getline(info,10);         // 丟棄 \n
/*
輸入:1234567890123
輸出:1 2 3 4 5 6 7 8 9 _ (第10位存放字符串結束符'\0')
*/
cin.get(info,100);            // 保留 \n 在輸入隊列

// String字符串
string str;
cin >> str;
getline(cin,str);             // 讀取一行,丟棄 \n

// 兩個版本的getline都有可選參數
cin.getline(info,100,':');    // 讀到 :停止,並丟棄
getline(cin,str,':');         // 讀到 :停止,並丟棄

(1)在C++中有兩種getline函數

  • 第一種:在<istream>中的getline()函數有兩種重載形式
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );

作用是: 從istream中讀取至多n個字符(包含結束標記符 '\0')保存在s對應的數組中。

即使還沒讀夠n個字符,如果遇到delim或字數達到限制,則讀取終止,delim不會被保存進s數組中。

  • 第二種:在<string>中的getline函數有四種重載形式
istream& getline (istream&  is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream&  is, string& str);
// 用法和第3種類似,但是讀取的istream是作爲參數is傳進函數的,讀取的字符串保存在string類型的str中
istream& getline (istream&& is, string& str);

函數的變量

  • is    :表示一個輸入流,例如cin。
  • str   :string類型的引用,用來存儲輸入流中的流信息。
  • delim :char類型的變量,所設置的截斷字符;在不自定義設置的情況下,遇到 '\n' ,則終止輸入。
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string name1,name2;
    cout << "輸入姓名";
    getline(cin, name1);                 // 在輸入時,遇到 '\n' 或EOF,終止輸入
    getline(cin, name2, '#');            // 在輸入時,遇到 '#' 終止輸入
    cout << name1 << endl;
    cout << name2 << endl;
    return 0;
}

/*
EOF是C語言中爲了區分有效數據和輸入結束符的;
getline不是C庫函數,而是C++庫函數;
它遇到以下情況發生會導致生成的本字符串結束:
(1)到文件結束
(2)遇到函數的定界符
(3)輸入達到最大限度
*/

(2)sscanf函數 

讀取格式化的字符串中的數據,頭文件 stdio.h ,

// 一般用法
char buf[512];
sscanf("123456", "%s", buf);
printf("%s\n", buf);
結果爲:123456

// 取指定長度的字符串
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);
結果爲:1234

// 取到指定字符爲止的字符串,取遇到空格爲止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);
結果爲:123456

// 取僅包含指定字符集的字符串,取僅包含1到9和小寫字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);
結果爲:123456abcdedf

// 取到指定字符集爲止的字符串,取遇到大寫字母爲止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);
結果爲:123456abcdedf

// 給定一個字符串iios/12DDWDFF@122,獲取 / 和 @ 之間的字符串,先將 "iios/"過濾掉,再將非'@'的一串內容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);
結果爲:12DDWDFF

// 給定一個字符串"hello, world",僅保留"world"。(注意:“,”之後有一空格)
sscanf("hello, world", "%*s%s", buf);
printf("%s\n", buf);
結果爲:world
/*
    %*s表示第一個匹配到的%s被過濾掉,即hello被過濾了,
    如果沒有空格則結果爲NULL
*/

集合操作

  1. %[a-z] 表示匹配a到z中任意字符,貪婪性(儘可能多的匹配)
  2. %[aB'] 匹配a、B、'中一員,貪婪性
  3. %[^a] 匹配非a的任意字符,並且停止讀入,貪婪性

(3)istringstream類的用法

// 將讀入的一行中的三個整數存儲到了a, b, c中
ifstream fin(fname);
int a,b,c;
string s;
getline(fin, s);
istringstream ss(s);
ss >> a >> b >> c;

#include<iostream>  
#include<sstream>                    // istringstream 必須包含這個頭文件
#include<string>  
using namespace std;
 
int main()  
{  
    string str = "i am a boy";  
    istringstream is(str);  
    string s;  
    while(is >> s)  
    {  
        cout << s << endl;  
    }  
      
}
/*
輸出是:
i
am
a
boy
*/

C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們創建對象必須包含 <sstream> 頭文件。

  1. istringstream類用於執行C++風格的串流的輸入操作
  2. ostringstream類用於執行C風格的串流的輸出操作
  3. strstream類同時可以支持C風格的串流的輸入輸出操作

(4)機試題:日誌排序

 

 

 

 

參考:《 C++ Primer 》 P659,string類輸入

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章