getline
是 C++ 标准库中的一个函数,用于从输入流中读取一行文本。它的一般形式如下:
std::istream& getline(std::istream& is, std::string& str);
其中:
is
是输入流对象(通常是std::cin
)。str
是用于存储读取内容的字符串对象。
getline
的基本用法
#include <iostream>
#include <string>
int main() {
std::string input;
std::cout << "Enter a line of text: ";
std::getline(std::cin, input);
std::cout << "You entered: " << input << std::endl;
return 0;
}
这个程序将提示用户输入一行文本,并将输入内容存储在 input
字符串中,最后输出该内容。
getline
的详细语法和行为
-
读取整个一行文本:
getline
从输入流中读取字符,直到遇到换行符 ('\n'
) 为止。换行符不会被存储在目标字符串中,而是被丢弃。 -
返回值:
getline
返回一个引用类型std::istream&
,这样可以进行链式调用和条件检查。例如,可以用它来检查输入是否成功:if (std::getline(std::cin, input)) { // 读取成功 } else { // 读取失败或到达文件结尾 }
-
忽略剩余字符:
如果之前使用了cin >>
进行输入操作,并且该操作没有读取到换行符,那么换行符仍然留在输入缓冲区中。在这种情况下,直接使用getline
会立即读取到这个换行符,并返回一个空字符串。为了解决这个问题,可以在cin >>
操作后调用cin.ignore()
,以忽略输入缓冲区中的换行符。int age; std::cin >> age; std::cin.ignore(); // 忽略换行符 std::getline(std::cin, input); // 现在可以正确读取一整行文本
-
指定分隔符:
getline
还有一个变体,可以指定自定义的分隔符:std::getline(std::cin, input, ','); // 使用逗号作为分隔符
这种方式下,
getline
会读取字符直到遇到指定的分隔符(如逗号),分隔符同样不会被存储在目标字符串中。
完整示例
#include <iostream>
#include <string>
int main() {
std::string name;
int age;
std::string response;
std::cout << "What is your name? ";
std::getline(std::cin, name);
std::cout << "What is your age? ";
std::cin >> age;
std::cin.ignore(); // 忽略换行符
std::cout << "Hello " << name << " (age " << age << ")" << '\n';
std::cout << "Do you want to try again? ";
std::getline(std::cin, response);
std::cout << "You said: " << response << std::endl;
return 0;
}
这个程序演示了如何使用 getline
来读取用户输入的一整行文本,包括如何处理混合使用 cin >>
和 getline
的问题。