cin/getline/gets

本文详细介绍了C++中cin、getline和gets的使用方法,包括cin的介绍、cin>>、cin.get、getline和gets的用法及注意事项,强调了cin读取数据时如何处理换行符和空格,以及如何清空输入缓冲区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.cin简介

cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主 要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象, 也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。

在理解cin功能时,不得不提标准输 入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这 个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字 符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

2. cin的常用读取方法

使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,cin.getline。

2.1cin>>的用法

cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。实例程序如下:

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     char a;
 6     int b;
 7     float c;
 8     cin >> a >> b >> c;
 9     cout << a << " " << b << " " << c << " " << endl;
10     system("pause");
11     return 0;
12 }

在屏幕中一次输入:a[回车]11[回车]5.56[回车],程序将输出如下结果:

注意: (1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。 (2)当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清 除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。 (3)不想略过空白字符,那就使用 noskipws 流控制。比如cin>>noskipws>>input;

验证程序见如下:

 1 #include <string> 
 2 #include <iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     char a;
 7     int b;
 8     float c;
 9     string str;
10     cin >> a >> b >> c >> str;
11     cout << a << " " << b << " " << c << " " << str << endl;
12     string test;    getline(cin, test);//不阻塞    
13     cout << "test:
### C++ 中 `cin`、`getline` 和 `gets` 的区别及用法 #### 使用 `cin` `cin` 是用于输入操作的标准流对象,通常与提取运算符 (`>>`) 结合使用来读取数据。此方法适合读取单个单词或数值类型的输入。 ```cpp #include <iostream> using namespace std; int main() { string word; cout << "Enter a word: "; cin >> word; // Reads until whitespace is encountered. cout << "You entered: " << word << endl; } ``` 上述代码片段展示了如何利用 `cin` 来获取用户输入的一个词[^1]。 #### 使用 `getline` 对于需要处理整行字符串的情况,推荐采用 `std::getline()` 函数。该函数可以从标准输入或其他字符流中读入一整个行的内容直到遇到换行符为止,并不会因为空白而停止读取。 ```cpp #include <iostream> #include <string> // Required for using 'string' type with getline() using namespace std; int main() { string line; cout << "Enter a sentence: "; getline(cin, line); // Reads the entire line including spaces. cout << "You entered: " << line << endl; } ``` 这段程序说明了怎样通过调用 `std::getline()` 获取完整的句子甚至是一段话。 #### 关于 `gets` 值得注意的是,在现代 C++ 编程实践中不建议再使用 `gets()` 函数,因为它无法安全地控制缓冲区大小从而容易引发溢出风险。尽管它曾经被用来从 stdin 接收未指定长度的一行文本,但由于其潜在的安全隐患已经被弃用了。 ```cpp // Not recommended due to security risks associated with buffer overflows. char str[10]; cout << "Enter text (unsafe): "; gets(str); puts(str); ``` 出于安全性考虑,应当完全避免在新项目里运用这个过时的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值