cin.get();cin.getline();getline(cin,string);cin.ignore()的理解

本文详细介绍了C++中cin.get(), cin.getline(), getline()及cin.ignore()等输入流函数的使用方法,包括如何接收字符、字符串以及如何处理输入流中的空白字符。
1、cin.get()

用法1: cin.get(字符变量名)可以用来接收字符

#include <iostream>
using namespace std;
main ()
{
char ch;
ch=cin.get(); //或者cin.get(ch);
cout<<ch<<endl;
}

输入:jljkljkl
输出:j

用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

#include <iostream>
using namespace std;
main ()
{
char a[20];
cin.get(a,20);
cout<<a<<endl;
}

输入:jkl jkl jkl
输出:jkl jkl jkl

输入:abcdeabcdeabcdeabcdeabcde (输入25个字符)
输出:abcdeabcdeabcdeabcd (接收19个字符+1个'\0')

用法3:cin.get(无参数)没有参数主要是用于舍弃输入流中的不需要的字符,或者舍弃回车,弥补cin.get(字符数组名,接收字符数目)的不足.

这个我还不知道怎么用,知道的前辈请赐教;

2、cin.getline() // 接受一个字符串,可以接收空格并输出

#include <iostream>
using namespace std;
main ()
{
char m[20];
cin.getline(m,5);
cout<<m<<endl;
}

输入:jkljkljkl
输出:jklj

接受5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;

如果把5改成20:
输入:jkljkljkl
输出:jkljkljkl

输入:jklf fjlsjf fjsdklf
输出:jklf fjlsjf fjsdklf

//延伸:
//cin.getline()实际上有三个参数,cin.getline(接受字符串的看哦那间m,接受个数5,结束字符)
//当第三个参数省略时,系统默认为'\0'
//如果将例子中cin.getline()改为cin.getline(m,5,'a');当输入jlkjkljkl时输出jklj,输入jkaljkljkl时,输出jk

当用在多维数组中的时候,也可以用cin.getline(m[i],20)之类的用法:

#include<iostream>
#include<string>
using namespace std;

main ()
{
char m[3][20];
for(int i=0;i<3;i++)
{
cout<<"\n请输入第"<<i+1<<"个字符串:"<<endl;
cin.getline(m[i],20);
}

cout<<endl;
for(int j=0;j<3;j++)
cout<<"输出m["<<j<<"]的值:"<<m[j]<<endl;

}

请输入第1个字符串:
kskr1

请输入第2个字符串:
kskr2

请输入第3个字符串:
kskr3

输出m[0]的值:kskr1
输出m[1]的值:kskr2
输出m[2]的值:kskr3

3、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include<string>”

#include<iostream>
#include<string>
using namespace std;
main ()
{
string str;
getline(cin,str);
cout<<str<<endl;
}

输入:jkljkljkl
输出:jkljkljkl

输入:jkl jfksldfj jklsjfl
输出:jkl jfksldfj jklsjfl

和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数


4、cin.ignore()


cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。

比如可以这么用:cin.ignore(1024,'\n'),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去。

eg.
#include <iostream>
using namespace std;
void main()
{
int a,b,c;
cout<<"input a:";
cin>>a;
cin.ignore(1024, '\n');
cout<<"input b:";
cin>>b;
cin.ignore(1024, '\n');
cout<<"input c:";
cin>>c;
cout<<a<<"\t"<<b<<"\t"<<c<<endl;
}

如果没有cin.ignore(),可以一次输入3个数,用空格隔开就好了。可是非常不美观。。这样才是我们想要的。

如果cin.ignore()不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉注意:并不是把EOF的前一个,其实是把剩余输入缓存区里的左边第一个字符清掉)没有遇到EOF就清掉一个字符然后结束,会导致不正确的结果,因为EOF是文件结束标识呵。(注:EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin))

#include<iostream> 

 
using 
 namespace  std;  

void main()  
 
char 
 str1[30],str2[30],str3[30];  
cout 
 <<  "请输入你的姓名:";  
cin>>str1; 
 
cout<<"请输入你的住址:"; 
 
cin.ignore(); 
 
cin.getline(str2,30,'a'); 
 
cout 
 <<  "请输入你的籍贯:";  
cin.ignore(); 
 
cin.getline(str3,30); 
 
cout<<str3; 
 
 

如果在cin>>str1那里输入bcdabcd,那么此时流里面剩的是bcd\n,此时cin.ignore()吃掉的就是b了,这是流里还剩下cd\n直接交给cin.getline(str3,30);因为有个\n所以这里getline就直接返回.




<think>我们讨论的是C++中的输入方法。cin.get()cin.getline()都是用于从标准输入读取数据,但有一些关键区别。1.cin.get()可以读取单个字符或字符数组,遇到换行符停止,但不会从输入流中丢弃换行符。2.cin.getline()读取一行(字符数组),直到遇到换行符或指定分隔符,并丢弃换行符(或指定的分隔符)。下面我们详细说明两者的区别,并给出代码示例。</think>### C++ `cin.get()` 与 `cin.getline()` 的区别详解 在 C++ 中,`cin.get()` `cin.getline()` 都是用于处理输入的函数,但它们在行为使用场景上有显著区别。以下是两者的全面对比: #### 核心区别总结 | 特性 | `cin.get()` | `cin.getline()` | |------|-------------|-----------------| | **用途** | 读取单个字符或字符数组 | 读取整行文本 | | **处理分隔符** | 保留在输入流中 | 从输入流中提取并丢弃 | | **缓冲区溢出** | 可能发生(不安全) | 自动防止(安全) | | **返回值** | 字符或流引用 | 流引用 | | **空终止符** | 不会自动添加 | 自动添加 | | **重载形式** | 多种重载 | 较少重载 | --- #### 1. 函数原型对比 **`cin.get()`**: ```cpp // 读取单个字符 istream& get(char& ch); // 读取字符数组(不丢弃分隔符) istream& get(char* s, streamsize n); // 读取字符数组(可指定分隔符) istream& get(char* s, streamsize n, char delim); ``` **`cin.getline()`**: ```cpp // 读取整行(自动丢弃换行符) istream& getline(char* s, streamsize n); // 读取直到指定分隔符 istream& getline(char* s, streamsize n, char delim); ``` --- #### 2. 关键行为差异 ##### 分隔符处理 ```cpp #include <iostream> using namespace std; int main() { char buffer1[50]; char buffer2[50]; cout << "测试输入: "; cin.get(buffer1, 10); // 输入 "HelloWorld" 后按回车 cin.getline(buffer2, 50); // 尝试读取下一行 cout << "get(): " << buffer1 << endl; cout << "getline(): " << buffer2 << endl; return 0; } ``` **输出**: ``` 测试输入: HelloWorld get(): HelloWorl getline(): d ``` **解释**: - `get()` 读取了前 9 个字符(保留换行符在缓冲区) - `getline()` 读取了剩余的 "d" 换行符 --- #### 3. 安全性与缓冲区处理 ```cpp #include <iostream> using namespace std; int main() { const int SIZE = 5; char unsafe[SIZE]; char safe[SIZE]; cout << "输入超过4字符: "; cin.get(unsafe, SIZE); // 危险:可能溢出 cout << "再次输入: "; cin.ignore(100, '\n'); // 清除缓冲区 cin.getline(safe, SIZE); // 安全:自动截断 cout << "get(): " << unsafe << endl; cout << "getline(): " << safe << endl; return 0; } ``` **输出**: ``` 输入超过4字符: ABCDEFG 再次输入: HIJKLMN get(): ABCD☠️ // 缓冲区溢出风险 getline(): HIJK ``` **关键点**: - `get()` 不检查边界,可能导致缓冲区溢出 - `getline()` 自动在末尾添加空终止符,确保安全 --- #### 4. 实用场景推荐 **使用 `cin.get()` 的场景**: 1. 读取单个字符 ```cpp char ch; cin.get(ch); // 精确读取一个字符 ``` 2. 查看但不消耗下一个字符 ```cpp char next = cin.peek(); // 查看下一个字符 if (next == '\n') { cin.get(); // 消耗换行符 } ``` **使用 `cin.getline()` 的场景**: 1. 读取整行文本 ```cpp char address[100]; cin.getline(address, 100); // 安全读取地址 ``` 2. 处理CSV数据 ```cpp char data[256]; while (cin.getline(data, 256, ',')) { // 处理每个逗号分隔的字段 } ``` --- #### 5. 最佳实践建议 1. **优先使用 `getline()`**: - 更安全的字符串输入 - 自动处理分隔符 - 避免缓冲区溢出 2. **混合使用时清除缓冲区**: ```cpp int age; string name; cout << "年龄: "; cin >> age; // 清除残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "姓名: "; char fullName[50]; cin.getline(fullName, 50); ``` 3. **C++字符串替代方案**: ```cpp #include <string> string safeInput; getline(cin, safeInput); // 使用string版本,无需指定大小 ``` --- #### 6. 特殊行为演示 ```cpp #include <iostream> using namespace std; int main() { cout << "测试分隔符行为:\n"; char buf1[20], buf2[20]; cout << "输入带#的文本: "; cin.get(buf1, 20, '#'); // 读取直到# cout << "get()结果: " << buf1 << endl; cin.ignore(); // 跳过# cout << "继续输入: "; cin.getline(buf2, 20, '!'); // 读取直到! cout << "getline()结果: " << buf2 << endl; return 0; } ``` **输入/输出**: ``` 测试分隔符行为: 输入带#的文本: Part1#Part2 get()结果: Part1 继续输入: Section1!Section2 getline()结果: Section1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值