cin与getline区别C++

本文探讨了C++中使用cin和getline函数输入字符串的区别。cin遇到空格即停止读取,无法处理包含空格的字符串;而getline则能读取整行,包括空格,更适合读取复杂的字符串数据。

虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题。

当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。以下面的语句为例:

cin >> namel;
可以输入 “Mark” 或 “Twain”,但不能输入 “Mark Twain”,因为 cin 不能输入包含嵌入空格的字符串。下面程序演示了这个问题:

// This program illustrates a problem that can occur if
// cin is used to read character data into a string object.
#include <iostream>
#include <string> // Header file needed to use string objects
using namespace std;

int main()
{
    string name;
    string city;
    cout << "Please enter your name: ";
    cin >> name;
    cout << "Enter the city you live in: ";
    cin >> city;
    cout << "Hello, " << name << endl;
    cout << "You live in " << city << endl;
    return 0;
}


程序输出结果:

Please enter your name: John Doe
Enter the city you live in: Hello, John
You live in Doe

请注意,在这个示例中,用户根本没有机会输入 city 城市名。因为在第一个输入语句中,当 cin 读取到 John 和 Doe 之间的空格时,它就会停止阅读,只存储 John 作为 name 的值。在第二个输入语句中, cin 使用键盘缓冲区中找到的剩余字符,并存储 Doe 作为 city 的值。

为了解决这个问题,可以使用一个叫做 getline 的 C++ 函数。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。

getline 函数如下所示:

getline(cin, inputLine);
其中 cin 是正在读取的输入流,而 inputLine 是接收输入字符串的 string 变量的名称。下面的程序演示了 getline 函数的应用:

// This program illustrates using the getline function
//to read character data into a string object.
#include <iostream>
#include <string> // Header file needed to use string objects
using namespace std;

int main()
{
    string name;
    string city;
    cout << "Please enter your name: ";
    getline(cin, name);
    cout << "Enter the city you live in: ";
    getline(cin, city);
    cout << "Hello, " << name << endl;
    cout << "You live in " << city << endl;
    return 0;
}


程序输出结果:

Please enter your name: John Doe
Enter the city you live in: Chicago
Hello, John Doe
You live in Chicago

补充:
cin.get()获取一个字符
cin.getline() 获取一行字符串
getline(cin,s)是C的,获取一行字符串

C++ 中,`cin` 和 `getline` 是两种用于从标准输入读取数据的机制,它们在功能和使用场景上有显著差异。 `cin` 是一个输入流对象,主要用于读取格式化的输入。它通过运算符 `>>` 提取数据,默认情况下以空格、制表符或换行符作为分隔符,因此适合读取单个单词或基本数据类型(如 `int`、`double` 等)。由于 `cin` 会跳过输入中的空白字符,它不适用于读取包含空格的字符串[^1]。 相比之下,`getline` 是一种非成员函数,定义在 `<string>` 头文件中,其原型为 `istream& getline (istream& is, string& str, char delim);`,其中 `str` 用于存储读取的内容,`delim` 是结束符,默认为换行符。`getline` 能够读取包含空格的整行输入,直到遇到换行符为止,并且会丢弃换行符[^5]。 此外,C++ 标准库还提供了 `cin.getline()` 方法,它是 `istream` 类的成员函数,定义在 `<iostream>` 头文件中,用于读取字符数组形式的输入,其原型为 `istream& getline (char* s, streamsize n);`,同样读取到换行符并丢弃之[^2]。 以下是一个简单的示例,演示了 `cin.getline()` 的使用: ```cpp #include <iostream> using namespace std; int main() { const int MAX_LEN = 50; char buffer[MAX_LEN]; cout << "请输入一行文字:"; cin.getline(buffer, MAX_LEN); cout << "您输入的内容是:" << buffer << endl; return 0; } ``` 当混合使用 `cin >>` 和 `getline()` 时需要注意,`cin >>` 可能会在输入流中留下换行符,这会导致紧接着的 `getline()` 立即返回而没有读取任何数据。为了解决这个问题,可以在 `cin >>` 输入流完成之后,在调用 `getline()` 之前,使用 `cin.ignore()` 或者读取一个空字符串来清除换行符[^5]。 总结来说,如果需要读取的是简单的、不含空格的数据,可以使用 `cin`;若要读取包含空格的一整行文本,则推荐使用 `getline` 或 `cin.getline()`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值