C++中getline函数的使用

本文详细介绍了C++中两种getline函数的使用方法及区别,一种是string头文件中的全局函数,另一种是istream的成员函数。同时提供了示例代码,展示了如何使用这些函数来处理输入流。

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

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main(){
 7 
 8     char* s;
 9     s = new char[50]; //必须要分配空间
10     cin.getline(s,5);
11     int i = 0;
12     while(s[i] != '\0'){
13         cout<<s[i];
14         i++;
15     }
16     cout<<endl<<i<<endl;
17     cin.clear(); //当failbit位为1时需要clear,否则后面的getline读取为空字符串
18     
19     string str;
20     getline(cin,str);
21     cout<<str<<endl;
22     getline(cin,str,'#');
23     cout<<str<<endl;
24     getline(cin,str);
25     cout<<str<<endl;
26 
27     return 0;
28 }

输入输出:

(input)slkdsa;34
slkd
4
sa;34
(input)hel#id
hel
id

 分析:

C++中有两个getline函数,一个是在string头文件中,定义的是一个全局的函数,函数声明是istream& getline ( istream& is, string& str, char delim )与istream& getline ( istream& is, string& str );

另一个则是istream的成员函数,函数声明是istream& getline (char* s, streamsize n )与istream& getline (char* s, streamsize n, char delim );注意第二个getline是将读取的字符串存储在char数组中而不可以将该参数声明为string类型,因为C++编译器无法执行此默认转换。

 

getline函数大致流程:

1、首先判断istream的failbit位是否为1,为1的话意味着输入流的状态有错误,则不进行读操作,getline函数结束执行

2、从当前位置开始从输入流中依次读取单个字符并拷贝到缓冲区,直到遇到下列条件满足时,循环结束。

(1)遇到文件尾时停止读操作,并设置流对象的结束标记为1

(2)读到调用者指定的分隔符时,此时将分隔符之前的字符拷贝到缓冲区中,但分隔符本身不拷贝进去,并且下次读操作将从分隔符后的下一个字符开始。

(3)已经读了n-1个字符(n是调用者传入的第二个实参_Count的初值),此时要把流对象的错误标志位置1

 

利用getline连续读取直至文末

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main(){
 7 
 8     string s;
 9     while(getline(cin,s)){
10         cout<<s<<endl;;
11     }
12 
13     return 0;
14 }

 

转载于:https://www.cnblogs.com/hu983/p/5573607.html

<think>我们正在讨论C++getline函数使用方法。根据引用内容,getline函数主要用于读取整行输入,包括空格,直到遇到换行符或指定的分隔符。引用[3]和[4]提供了重要信息:getline有两个版本,一个用于C风格字符串(字符数组),另一个用于C++的string对象。同时,getline可以指定分隔符(默认是换行符)。使用getline读取string对象的基本语法:#include <string>stringline;getline(cin,line);//从标准输入读取一行,直到换行符(换行符被丢弃)使用getline读取字符数组的基本语法(实际上是istream的成员函数):char str[100];cin.getline(str,100);//读取最多99个字符(保留一个给'\0')或者直到遇到换行符(换行符被丢弃)另外,还可以指定分隔符,例如:getline(cin,line,':'); //读取直到遇到':',丢弃':'注意:与cin>>的区别是,cin>>遇到空格、制表符、换行符就会停止读取,而getline可以读取空格,直到遇到换行符(或指定分隔符)才停止。引用[2]展示了getline在循环中读取多行直到文件结束(或输入结束)的用法。因此,回答应该包括:1.两种getline使用(字符数组和string)2.指定分隔符的用法3.与cin>>的对比4.示例代码同时,根据引用[1]和[3],我们注意到cin.get()与cin.getline()在处理换行符上的区别:cin.get()会将换行符留在输入流中,而cin.getline()会丢弃换行符。但是用户的问题是关于getline的,所以我们重点放在getline上。另外,引用[5]提到getline的结束条件:文件结束、遇到定界符、达到最大限制。下面组织回答:</think>### C++getline函数使用方法 `getline()`是C++中用于读取整行输入的函数,能处理包含空格的字符串输入,克服了`cin >>`遇到空格就终止读取的限制。根据使用场景不同,分为两种形式: #### 1. **读取到`string`对象(推荐)** ```cpp #include <iostream> #include <string> using namespace std; int main() { string line; // 读取整行(默认以换行符结束) getline(cin, line); cout << "输入内容: " << line << endl; // 指定分隔符(读取到':'停止) getline(cin, line, ':'); cout << "分隔符内容: " << line << endl; return 0; } ``` - **特点**:自动处理内存分配,无需预设缓冲区大小。 - **分隔符**:第三个参数可指定结束符(默认`'\n'`),读取后丢弃该字符[^3][^4]。 #### 2. **读取到字符数组(C风格字符串)** ```cpp #include <iostream> using namespace std; int main() { char buffer[100]; // 读取整行(最多99字符+'\0') cin.getline(buffer, 100); cout << "字符数组: " << buffer << endl; // 指定分隔符(读取到'#'停止) cin.getline(buffer, 100, '#'); cout << "自定义分隔符: " << buffer << endl; return 0; } ``` - **特点**:需预先分配固定大小缓冲区,存在溢出风险。 - **语法**:`cin.getline(数组名, 最大字符数, [分隔符])`[^1][^3]。 --- #### 🚫 常见错误与注意事项 1. **混合使用`cin >>`和`getline()`** `cin >>`会留下换行符在输入流,导致后续`getline()`立即结束。需用`cin.ignore()`清除残留字符: ```cpp int num; string text; cin >> num; cin.ignore(); // 清除换行符 getline(cin, text); // 正常读取 ``` 2. **缓冲区溢出风险(字符数组版本)** 若输入超过预设大小,会截断数据并设置`failbit`,需用`cin.clear()`重置状态[^5]。 3. **循环读取多行** 结合`while`循环处理不定量输入(如文件结束): ```cpp string line; while (getline(cin, line)) { cout << line << endl; } ``` 当遇到`EOF`(Windows: `Ctrl+Z`, Linux: `Ctrl+D`)或读取失败时终止[^2]。 --- #### 💡 与`cin.get()`的区别 | 函数 | 是否保留换行符 | 目标类型 | 安全性 | |---------------|----------------|----------------|--------------| | `cin.getline` | 丢弃 | 字符数组 | 自动添加`\0` | | `cin.get` | 保留在流中 | 字符数组/字符 | 需手动处理 | ```cpp char arr1[20], arr2[20]; cin.get(arr1, 20); // 换行符留在输入流 cin.get(); // 需额外读取换行符 cin.getline(arr2,20);// 直接读取下一行 ``` --- #### 总结应用场景 - 读取包含空格的字符串(如句子、文件路径)。 - 按自定义分隔符解析数据(如`CSV`文件)。 - 安全处理用户输入(避免`cin >>`意外截断)[^4][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值