cin/getline/gets

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

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:
`cin.getline` 和 `gets` 都是用于从标准输入读取字符串的函数,但它们存在诸多区别: ### 安全性 - **`cin.getline`**:`cin.getline` 是安全的,它需要指定读取的最大字符数,防止缓冲区溢出。例如 `cin.getline(str, 20)` 表示最多读取 19 个字符(要留一个位置给字符串结束符 `'\0'`),当达到最大字符数时,读取会停止,避免了超出数组边界的问题 [^1]。 - **`gets`**:`gets` 函数不要求指定读取的最大字符数,它会一直读取输入直到遇到换行符。这就导致如果输入的字符串长度超过了数组的大小,就会发生缓冲区溢出,从而可能引发程序崩溃或安全漏洞。因此,`gets` 函数在 C11 标准中已被弃用,在 C++ 中也不推荐使用。 ### 处理换行符 - **`cin.getline`**:`cin.getline` 会读取换行符并将其丢弃,不会将换行符存储在数组中。它会在读取到指定的最大字符数、遇到换行符或文件结束符时停止读取 [^1]。 - **`gets`**:`gets` 函数同样会读取换行符,但它会将换行符替换为字符串结束符 `'\0'`,不会将换行符留在输入缓冲区中。 ### 头文件和命名空间 - **`cin.getline`**:`cin.getline` 是 `iostream` 库中 `istream` 类的成员函数,使用时需要包含 `<iostream>` 头文件,并使用 `std` 命名空间 [^1]。 ```cpp #include <iostream> using namespace std; int main() { char str[20]; cin.getline(str, 20); cout << str << endl; return 0; } ``` - **`gets`**:`gets` 是 C 标准库中的函数,使用时需要包含 `<cstdio>` 头文件(在 C++ 中)或 `<stdio.h>` 头文件(在 C 中)。 ```cpp #include <cstdio> int main() { char str[20]; gets(str); printf("%s\n", str); return 0; } ``` ### 缓冲区管理 - **`cin.getline`**:如果输入的字符数超过了指定的最大字符数,`cin.getline` 会将多余的字符留在输入缓冲区中,并且会设置流的错误状态,可以通过 `cin.clear()` 来清除错误状态。 - **`gets`**:`gets` 不会对输入缓冲区进行额外的管理,它只是简单地读取输入直到遇到换行符。 ### 兼容性 - **`cin.getline`**:`cin.getline` 是 C++ 标准库的一部分,适用于 C++ 程序。 - **`gets`**:`gets` 是 C 标准库的函数,虽然在 C++ 中也可以使用,但由于其安全性问题,不建议在 C++ 中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值