cin、cin.getline、cin.get、cin.ignore

本文详细介绍了C++中的几种输入流操作,包括cin、cin.get、cin.ignore和cin.getline的用法。cin会忽略空格,而cin.get能读取包括空格在内的所有字符。当混合使用cin>>和cin.get时可能出现问题,可以通过cin.ignore来解决。此外,cin.getline用于读取一整行,cin.width可以设置输入域宽。

1.cin

  • cin>>只读取第一个非空白字符,使用cin>>读入时,它将忽略前面的所有空格,不能实现按任意键继续的功能。

2.cin.get

  • cin.get读取输入中的第一个字符,包括空格、Tab、Enter。
  • 用>>读入,使用cin>>读入时,它将忽略前面的所有空格,不能实现按任意键继续的功能。
  • 在程序设计中,会遇到要读取一个字符的情况,如,系统提示按任意键继续。这时则可使用cin.get(),cin.get读取输入中的第一个字符,包括空格、Tab、Enter。
char ch;
cin.get(ch);

3.cin.ignore

将cin>>和cin.get混用,往往会出现难以发现的问题

int num;char ch;
cou <<"输入一个整数";
cin >>num;
cout <<"输入一个字符";
cin.get(ch);
  • 当给num输入100,ch输入H时,发现输入100后cin.get被自动跳过,无法输入H,这是因为输入100并按Enter 键后,Enter键被留在缓冲区中,当程序执行到cin.get后自动读入缓冲区中的Enter键。
  • 解决方法是使用cin.ignore
cin.ignore(n, c);

n是一个整数,c是一个字符,含义是cin跳过n个字符,或者直到遇到字符c时为止。如果没有参数,将默认跳过键盘缓冲区中的第一个字符。
解决方法如下:

cou <<"输入一个整数";
cin >>num;
cin.ignore();
cout <<"输入一个字符";
cin.get(ch);

cin.ignore常用功能:清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。

4.cin.getline

  • cin提供函数成员getline,一次读取一行。
cin.getline(sentence, 20);

函数的第一个参数是数组名,第二个参数是待读取的字符个数(含空字符),上述语句将最多读取19个字符,最后一个位置用于存储’\0’。

正常情况下cin会忽略输入的第一个空格符,不输入至缓冲区;并且输入的字符会以’\0’(空格符)结束;

5.cin.width

char word[5];
cin.width(5);
cin >> word;

上面的程序,cin只读取4个字符到字符数组,最后一个字符为"\0"自动添加。cin.width指定了输入域宽,上面程序指定输入域宽为5。

cin >> setw(5) >> word;
  • 与上面程序效果一样。
    域宽只对与其相邻的下一个输入有效。
    当cin遇到空字符时它将停止读入。
    cin读取一定的字符后,多与字符将留在缓冲区中。
<think>我们正在讨论C++中输入函数cincin.get()和getline的区别。根据提供的引用,我们可以总结如下: 1. **cin**:使用>>操作符,它会跳过空白字符(空格、制表符、换行符等),直到遇到非空白字符开始读取,并在遇到空白字符或指定分隔符时停止。它不会读取空白字符,且换行符会残留在输入缓冲区中。 2. **cin.get()**:有两种主要形式: - 读取单个字符:`cin.get(char)` 或 `char ch = cin.get()`,它可以读取包括空白字符(如空格、换行符)在内的任意字符。 - 读取字符串:`cin.get(char_array, size)`,它读取指定大小的字符串,直到遇到换行符或达到指定大小减一(留一个位置给'\0')。注意,它不会丢弃换行符,换行符会留在输入缓冲区中。 3. **cin.getline()**:读取一行字符串,直到遇到换行符或达到指定大小减一。与cin.get()不同的是,它会读取并丢弃换行符,即换行符不会残留在输入缓冲区中。 4. **getline()**:C++标准库函数(在<string>头文件中),用于读取std::string对象。用法为`getline(cin, str)`,它读取整行,包括前导和嵌入的空格,直到遇到换行符(换行符被读取并丢弃,不存储在字符串中)。返回值是输入流(cin),因此可以用于链式操作(如连续读取)。 下面我们通过表格和示例代码来详细说明: ### 1. `cin` 的基本用法 - 跳过前导空白字符,读取到下一个空白字符(空格、制表符、换行)停止。 - 空白字符(包括换行符)会留在输入缓冲区。 示例: ```cpp #include <iostream> using namespace std; int main() { char a[10], b[10]; cin >> a; // 输入"hello world" cin >> b; cout << a << endl; // 输出"hello" cout << b << endl; // 输出"world" return 0; } ``` ### 2. `cin.get()` 的用法 #### (1) 读取单个字符 ```cpp char ch; cin.get(ch); // 或 ch = cin.get(); ``` - 可以读取任意字符,包括空白字符(空格、换行符等)。 #### (2) 读取字符串 ```cpp char str[10]; cin.get(str, 10); ``` - 读取一行,直到遇到换行符或读取了9个字符(第10个位置放'\0')。 - 注意:换行符会留在输入缓冲区中。 示例: ```cpp #include <iostream> using namespace std; int main() { char str1[10], str2[10]; cin.get(str1, 10); // 输入"1234567890",实际读取"123456789"(9个字符+'\0') cin.get(str2, 10); // 由于缓冲区中还有换行符(或下一个字符),这里可能直接失败(因为上一个读取后换行符还在,这次读取遇到换行符立即停止,所以str2为空) cout << str1 << endl; cout << str2 << endl; // 输出为空 return 0; } ``` ### 3. `cin.getline()` 的用法 ```cpp char str[10]; cin.getline(str, 10); ``` - 读取一行,直到遇到换行符或读取了9个字符(第10个位置放'\0')。 - 换行符被读取并丢弃,不会留在缓冲区。 示例: ```cpp #include <iostream> using namespace std; int main() { char str1[10], str2[10]; cin.getline(str1, 10); // 输入"1234567890",读取"123456789" cin.getline(str2, 10); // 可以继续读取下一行(因为上一行的换行符已被丢弃) cout << str1 << endl; cout << str2 << endl; return 0; } ``` ### 4. `getline()`(用于string)的用法 ```cpp #include <string> string str; getline(cin, str); ``` - 读取整行到string对象,包括空格,直到换行符(换行符被丢弃)。 - 可以处理任意长度的字符串(动态分配内存)。 示例: ```cpp #include <iostream> #include <string> using namespace std; int main() { string str1, str2; getline(cin, str1); // 输入"hello world" getline(cin, str2); // 输入"another line" cout << str1 << endl; // 输出"hello world" cout << str2 << endl; // 输出"another line" return 0; } ``` ### 总结对比表 | 函数/方法 | 读取对象 | 是否跳过空白 | 是否读取空白 | 是否保留换行符 | 读取字符串长度限制 | 动态内存 | |--------------------|----------|--------------|--------------|----------------|--------------------|----------| | `cin >> var` | 基本类型/字符数组 | 是 | 否(停在空白)| 是(换行符在缓冲区) | 有(数组大小) | 否 | | `cin.get(char)` | 单个字符 | 否 | 是 | 否(读取后移除) | 无 | 否 | | `cin.get(array,n)` | 字符数组 | 否 | 是(包括空格) | 是(换行符在缓冲区) | 有(n-1) | 否 | | `cin.getline(array,n)` | 字符数组 | 否 | 是(包括空格) | 否(读取并丢弃) | 有(n-1) | 否 | | `getline(cin,str)` | string | 否 | 是(包括空格) | 否(读取并丢弃) | 无(动态扩展) | 是 | ### 注意事项 1. 当混合使用`cin >>`和`getline`时,由于`cin >>`会留下换行符在缓冲区,紧接着的`getline`会读到空行(因为遇到换行符立即停止)。解决方法是在`cin >>`后使用`cin.ignore()`清除缓冲区中的换行符。 2. 对于字符数组的读取,如果输入的数据超过数组大小,会导致后续读取失败(设置failbit)。因此,使用`cin.getline`或`cin.get`时,需要确保输入不会超过数组大小,或者检查流状态并清除。 ### 示例:混合使用时的处理 ```cpp #include <iostream> #include <string> using namespace std; int main() { int n; string s; cin >> n; // 读取整数,但换行符留在缓冲区 cin.ignore(); // 忽略换行符 getline(cin, s); // 现在可以正常读取一行 cout << "n=" << n << ", s=" << s << endl; return 0; } ``` ### 相关问题 1.C++中,如何安全地读取包含空格的字符串? 2. 为什么在连续使用`cin`和`getline`时会出现读取错误?如何解决? 3. `cin.get()`和`cin.getline()`在处理换行符上有何不同? 4. 使用`getline(cin, str)`读取字符串时,如何判断文件结束? 5. C++11中是否有新的输入函数或改进? 请根据上述总结和示例,选择相关问题进行深入探讨。</think>### C++中`cin`、`cin.get()`和`getline()`的区别详解 在C++中输入处理时,`cin`、`cin.get()`和`getline()`是常用的输入函数,它们在处理空白字符、换行符和缓冲区管理上有显著区别。以下是详细对比: #### 1. **`cin`(标准输入流)** - **行为**:使用`>>`操作符读取数据,遇到**空白字符(空格、制表符、换行符)自动停止** - **特点**: - 跳过前导空白字符 - 读取到空白符时停止,**换行符残留在输入缓冲区** - 无法读取包含空格的字符串 - **示例**: ```cpp char str[10]; cin >> str; // 输入"Hello World" cout << str; // 输出"Hello"(空格后停止) ``` #### 2. **`cin.get()`(字符/字符串读取)** - **两种形式**: - **单字符读取**:`cin.get(char)` 或 `char ch = cin.get()` - 读取**任意字符(包括空格和换行符)** - 不跳过空白字符 - 换行符**残留在缓冲区**[^2][^4] - **字符串读取**:`cin.get(char_array, size)` - 读取到**换行符或指定长度减1**时停止 - 换行符**保留在缓冲区**[^2] - **示例**: ```cpp char str[10]; cin.get(str, 10); // 输入"1234567890" cout << str; // 输出"123456789"(第10位放'\0') ``` #### 3. **`getline()`(整行读取)** - **两种形式**: - **C风格字符串**:`cin.getline(char_array, size)` - 读取整行直到换行符 - **读取并丢弃换行符**(不留在缓冲区)[^2] - 可读取前导/嵌入空格 - **C++字符串**:`getline(cin, string_object)` - 读取整行到`std::string`对象 - 动态内存管理(无固定长度限制) - 换行符被丢弃[^1] - **示例**: ```cpp string str; getline(cin, str); // 输入" Hello World " cout << str; // 输出" Hello World "(保留所有空格) ``` ### 关键区别总结表 | **特性** | `cin >>` | `cin.get()` | `getline()` | |-------------------------|------------------------|------------------------|------------------------| | **读取空白字符** | ❌ 跳过 | ✔️ 读取 | ✔️ 读取 | | **换行符处理** | ❌ 残留在缓冲区 | ❌ 残留在缓冲区[^2] | ✔️ 读取并丢弃[^1][^2] | | **前导空格处理** | ❌ 跳过 | ✔️ 保留 | ✔️ 保留 | | **输入长度限制** | 有(数组大小) | 有(需指定大小) | 无(动态内存) | | **读取整行能力** | ❌ | ⚠️ 部分支持 | ✔️ 完美支持 | | **典型用途** | 读取单词/数字 | 读取含空格的固定字符串 | 读取整行文本 | ### 综合示例演示 ```cpp #include <iostream> #include <string> using namespace std; int main() { char arr1[10], arr2[10]; string str; // 示例1: cin >> 遇到空格停止 cin >> arr1; // 输入"Hello World" cout << arr1 << endl; // 输出"Hello" // 示例2: cin.get()读取含空格的字符串 cin.ignore(); // 清除残留换行符 cin.get(arr2, 10); // 输入"Test Line" cout << arr2 << endl; // 输出"Test Line" // 示例3: getline()读取整行 cin.ignore(); // 清除缓冲区 getline(cin, str); // 输入" C++ Input " cout << str << endl; // 输出" C++ Input " } ``` ### 使用建议 1. **读取单词/数字** → 用 `cin >>` 2. **读取含空格的固定长度字符串** → 用 `cin.get(char_array, size)` 3. **读取整行(含前导/嵌入空格)** → 优先用 `getline(cin, string_object)` 4. **混合使用时**:在`cin >>`后调用`cin.ignore()`清除残留换行符[^2][^4] > ⚠️ **重要提示**:当输入超过数组大小时,`cin.get()`和`cin.getline()`会设置流错误状态,导致后续输入失败[^4]。建议: > ```cpp > if (cin.fail()) { > cin.clear(); // 清除错误状态 > cin.ignore(1000, '\n'); // 清空缓冲区 > } > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值