首先,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
*/
集合操作
- %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
- %[aB'] 匹配a、B、'中一员,贪婪性
- %[^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> 头文件。
- istringstream类用于执行C++风格的串流的输入操作
- ostringstream类用于执行C风格的串流的输出操作
- strstream类同时可以支持C风格的串流的输入输出操作
(4)机试题:日志排序
参考:《 C++ Primer 》 P659,string类输入