cin , cin.get() , cin.getline() , getline() , cin.ignore() 的用法

本文详细介绍了C++中几种常见的字符输入方法,包括cin、cin.get()、cin.getline()、getline()及cin.ignore()等函数的应用场景和注意事项。通过具体实例展示了如何正确使用这些函数进行字符输入。

原文地址:http://blog.youkuaiyun.com/dpdldh/article/details/6154220

最近在搞ACM,所以学了一些基本的C++操作。但是发现C++对于字符的操作不像C那么简单。例如,对缓冲区回车符的过滤,string类型的输入等等小问题。所以,笔者通过一些小小的实践,验证了几个常用方法,贴出来献丑~~

(所有程序均在CodeBlock下调试通过)

  

cin

这个就不多说了,只说它像gets一样,可以过滤掉回车;

例如:

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. using namespace std;  
  4. int main ()  
  5. {  
  6.     char a, b;  
  7.     cin >> a >> b;  
  8.     cout << a << " " << b << endl;  
  9.     return 0;  
  10. }  

输入:a   (回车)

          b

输出: a b

 

把cin改成scanf,则不一样了:

 

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. using namespace std;  
  4. int main ()  
  5. {  
  6.     char a, b;  
  7.     scanf("%c%c",&a,&b);  
  8.     printf("%c %c/n",a,b);      
  9.     return 0;  
  10. }  

输入:a  (回车)

 b

输出:a

 

说明,scanf无法过滤掉回车;回车符在缓冲区里,被b接收了

 

 

 

 

 

cin.get()   

参数: cin.get(char c)                 //接受一个字符

          cin.get(char* str, int n)     //接受指定个数的字符串(不可接受string类型)

头文件:  <iostram>

例子1:

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. int main(void)  
  4. {     
  5.         char a;  
  6.     cin.get(a);  
  7.         cout << a << endl;  
  8.         return 0;  
  9. }  

输入: 123456

输出:1

 

例子2:

[cpp]  view plain copy
  1. #include <iostream>  
  2. using namespace std;  
  3. int main(void)  
  4. {     
  5.     char str[20];  
  6.     cin.get(str,19);    //19是允许读取的最大字符个数  
  7.      cout << str << endl;  
  8.     return 0;  
  9. }  

输入:123 456 567   (中间两个空格)

输出:123 456 567

 

注意:cin.get()接受字符串时,可以接受空格,tab;遇到回车结束输入

更多用法请参考:  http://www.cplusplus.com/reference/iostream/istream/get/

 

 

 

cin.getline()   

参数: cin.getline(char* str, int n)       //接受指定长度的字符串,可接受空格,tab;遇到回车结束;不可输入string类型

头文件: <iostream>

例子:

 

输入:abcde

      12345

输出:abcde

      12345

 

更多用法请参考:  http://www.cplusplus.com/reference/iostream/istream/getline/

 

 

 

getline()

参数:getline(istream a, string str)             //接受一个string类型字符串,可以接收空格并输出

头文件: <string>

例子:

 

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. int main ()   
  5. {  
  6.     string str;  
  7.     getline (cin,str);  
  8.     cout << str << "./n";  
  9. }  

 

 

输入:sdfsdf 234

输出:sdfsdf 234

 

更多内容,请参考:http://www.cplusplus.com/reference/string/getline/

 

 

 

 

cin.ignore()

参数:istream&  ignore ( streamsize n = 1, int delim = EOF )

头文件: <iostream>

用法:忽略指定长度字符,或者忽略指定字符;若不加参数,则默认忽略空格或换行

例子:

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <string>  
  4. using namespace std;  
  5. int main ()  
  6. {  
  7.     string num, str;  
  8.   
  9.     cin >> str;  
  10.     //cin.ignore();  
  11.     getline(cin,num);  
  12.     cout << str << endl << num << endl;  
  13.     return 0;  
  14. }  

输入: 1223  (回车)

输出: 1223

若把注释去掉,用上cin.ignore()。则:

输入:1234 6789

输出:1234

         6789

说明,把回车给过滤掉了

 

 

http://www.cplusplus.com/reference/iostream/istream/ignore/



<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、付费专栏及课程。

余额充值