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类输入

 

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