「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
在 C++ 中,如果我们需要从一个流中读取好几个句子,我们通常会首选的方法是使用 getline() 函数。因为它可以读取直到遇到换行符或看到用户提供的分隔符。
C++中本质上有两种getline函数,一种在头文件< istream >中,是istream类的成员函数。一种在头文件< string >中,是普通函数。 一、在< istream >中的getline函数有两种重载形式:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim ); 作用是从istream中读取至多n个字符保存在s对应的数组中。即使还没读够n个字符,如果遇到换行符’\n’(第一种形式)或delim(第二种形式),则读取终止,’\n’或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);
istream& getline (istream&& is, string& str);
用法和上一种类似,不过要读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。
下面是一个用 C++ 编写的示例程序,它读取四个句子并以“:换行符”在结尾显示它们
// 一个简单的 C++ 程序来显示 getline 的工作 #include <iostream> #include <cstring> using namespace std; int main() { string str; int t = 4; while (t--) { // 从 str 中的标准输入读取一行 getline(cin, str); cout << str << " : 换行符" << endl; } return 0; } 复制代码
样本输入:
这 是 海 拥 复制代码
正如预期的输出是:
这:换行符 是:换行符 海:换行符 拥:换行符 复制代码
上面的输入和输出看起来不错,输入之间有空行时可能会出现问题。
样本输入:
这 是 海 拥 复制代码
输出:
这:newline :newline 是:newline :newline 复制代码
它不打印最后 2 行。原因是即使没有读取任何字符, getline() 也会读取直到遇到 enter 。因此,即使第三行没有任何内容,getline() 也会将其视为单行。进一步观察第二行的问题。
可以修改代码以排除此类空行。
修改后的代码:
// 一个简单的 C++ 程序,它使用 getline 读取带有空行的输入 #include <iostream> #include <cstring> using namespace std; int main() { string str; int t = 4; while (t--) { getline(cin, str); // 有空行时继续阅读新行 while (str.length()==0 ) getline(cin, str); cout << str << " : 换行符" << endl; } return 0; } 复制代码
输入:
这 是 海 拥 复制代码
输出:
这:换行符 是:换行符 海:换行符 拥:换行符