getline() 的常用形式:
istream& getline(istream& is, string& str, char delim = '\n');
参数说明:
- istream& is: 输入流,例如 cin、ifstream 等。表示数据的来源。
- string& str: 用于存储读取到的字符串内容。
- char delim = '\n': 可选参数,指定行的分隔符,默认为换行符 \n。也就是说,默认情况下 getline() 会读取到换行符为止,但不包括换行符本身。
返回值:
- 返回输入流的引用,允许链式调用。
- 如果到达了输入的末尾(如 EOF),返回的流会变为无效状态,可用 is.eof() 或 is.fail() 检测。
getline() 的使用:
以下是结合你的代码的详细解释:
1. 在你的代码中:
getline(cin, line);
- 这里的 getline(cin, line) 从标准输入 cin 中读取一整行文本,直到遇到换行符 \n。
- line 是存储输入内容的 string 对象。
2. 为什么需要调用 getline() 两次?
- 第一调用:
- line);
- 这是为了消费掉前一行输入的换行符 \n(也就是 cin >> cnt 输入完后剩下的换行符)。
- 如果不这样,后续的 getline() 会读取到一个空行,导致逻辑错误。
- 第二调用(在循环中):
- line);
- 在循环中,getline() 每次会读取一行完整的输入数据。
3. getline() 和分隔符的理解:
- 默认情况下,getline() 使用换行符 \n 作为分隔符,读取输入时不包含换行符本身。
- 例如:
- input = "Hello World\nC++ Programming";
getline(cin, input);
- "Hello World" 并按回车,input 的值会是 "Hello World",不会包含 \n。
- 如果需要自定义分隔符,可以传递第三个参数。例如,读取到逗号为止:
- part;
input = "apple,banana,grape";
stream ss(input);
while (getline(ss, part, ',')) {
cout << part << endl;
}
banana
grape
总结:
- getline() 用于按行读取输入,可以避免逐字符或逐单词读取的麻烦。
- 在需要连续输入不同格式数据(如你的代码中 cin >> cnt 后读取一行字符串)时,调用一次空的 getline() 是常见的处理方式,用于跳过换行符。
- 默认分隔符是 \n,但可以自定义。