C++每次读取一行字符串输入

本文介绍了C++的istream类中面向行的成员函数getline()和get()。二者都读取一行输入至换行符,但getline()丢弃换行符,get()保留。getline()使用简单,get()便于检查错误,还介绍了它们的参数、使用示例及特点。

C++的istream中的类(如cin)提供了一些面向行的类成员函数:getlinr()和get()。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入队列中。

1.getline()

getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组名称,第二个参数是要读取的字符数如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。

例如,假设要使用getline()将姓名读入到一个包含20个元素的name数组中,可以用这样的函数调用:

cin.getline(name,20);

这将一行读入到name数组中——如果这行包含的字符不超过19个。

getline()函数每次读取一行。它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行符。

2.get()

istream类有另一个名为get()的成员函数,该函数有几种变体。其中一种变体的工作方式与getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get()并不再读取并丢弃换行符,而是将其留在输入队列中。假设连续两次调用get():

cin.get(name,ArSize);
cin.get(name,ArSize);    //a problem

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个 字符便是换行符。因此get()认为已经到达行尾,而没有发现任何可读取的内容。如果不借助于帮助,get()将不能跨过该换行符。

get()有另一种变体。使用不带任何参数的cin.get()调用可读取下一个字符(即使是换行符),因此可以用它来处理换行符,为读取下一行输入做准备:

cin.get(name,ArSize);   //read first line
cin.get();              //read newline
cin.get(name,ArSize);   //read second line

get()相比于getline()可以使得输入更仔细。例如,假设用get()将一行读入数组。如何知道停止原因是由于已经读取了整行,而不是由于数组已经填满了呢?查看下一个字符,如果是换行符,说明已经读取了整行;否则,说明该行中还有其他输入。

getline()使用起来简单一些,但get()使得检查错误更简单些。

 

注:本文是学习《C++ Primer》的笔记

### C++ 读取一行字符串的方法 在 C++ 中,读取一行字符串可以通过多种方法实现。以下是几种常见的方法,并附带代码示例。 #### 方法一:使用 `cin.getline` `cin.getline` 是一种从标准输入流中读取一行字符的方法。它可以指定存储字符的数组以及最大读取长度。当用户按下回车键时,输入结束[^1]。 ```cpp #include <iostream> using namespace std; int main() { char str[30]; cin.getline(str, 30); // 读取最多29个字符(包括'\0') cout << str << endl; return 0; } ``` #### 方法二:使用 `std::getline` `std::getline` 是一个更灵活的方法,通常与 `std::string` 结合使用。它可以从输入流中读取内容,直到遇到换符为止[^2]。 ```cpp #include <iostream> #include <string> using namespace std; int main(void) { string s; getline(cin, s); // 读取字符串 cout << s.size() << endl; // 输出字符串长度 return 0; } ``` #### 方法三:处理错误标记 如果输入超过了指定的缓冲区大小,`cin.getline` 会设置错误标志。此时可以使用 `cin.clear()` 清除错误标志并恢复输入状态[^3]。 ```cpp #include <iostream> using namespace std; int main() { char szBuf[6]; if (!cin.getline(szBuf, 6)) { // 如果输入超过5个字符,触发错误 cout << "error" << endl; } cout << szBuf << endl; cin.clear(); // 清除错误标志 int n; cin >> n; cout << n << endl; return 0; } ``` 以上三种方法均可用于读取一行字符串,具体选择取决于实际需求和数据类型。 ### 注意事项 - 使用 `cin.getline` 时需要确保目标数组有足够的空间以避免溢出。 - 使用 `std::getline` 时无需担心缓冲区大小问题,因为它动态分配内存。 - 当输入超出限制时,务必检查错误标志并采取相应措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值