我正在学习如何使用 getline 函数读取字符串。
我知道 getline 函数读取字符串,只要我们没有按回车键或 getline 参数中的大小值就会交叉。就我尝试 getline 函数读取一行字符串而言,我没有遇到任何问题。
但是当我试图在两个不同的字符数组中一个接一个地读取两行字符串时,我得到了我不期望的输出。要理解我的问题,请遵循以下几行
#include <iostream>
using namespace std;
int main()
{
char line1[10];
char line2[10];
cin.getline(line1,7);
cin.getline(line2,7);
cout << "\nline1 =" << line1 <<endl;
cout << "line2 =" << line2 <<endl;
}
Run Code Online (Sandbox Code Playgroud)
当我运行上面的程序时,它要求我输入,然后我将橙色作为第一个输入并按下回车按钮。
接下来它要求我提供第二个输入。然后我给了香蕉并按回车按钮。在这种情况下,它产生了我预期的结果。但是如果为第一个输入输入橙子,它不会等待我输入第二个输入。
结果 line1 存储橙色但 line2 保持空白。现在我的问题是 line1 存储橙色没有错。但我不明白为什么 line2 保持空白不应该包含 line1 接受输入后剩余的数据我的意思是 line2 不应该包含 s 作为值。
因为橙色是一个 6 位数的单词,所以 getline 将存储前六位数,然后在我设置 geline 7 的大小时添加一个空字符。
然后其他剩余的数据将在下一次调用 getline 函数时分配。所以不应该像第一次读取 new_line 字符后那样将 s 存储在 line2 中。
为什么第 2 行会保持空白,为什么在给出第一个输入后屏幕不会停止输入?
std::istream::getline 数据过载。
表现为UnformattedInputFunction。在构造并检查 sentry 对象后,从 *this 中提取字符并将它们存储在第一个元素由 s 指向的数组的连续位置中,直到发生以下任一情况(按所示顺序进行测试):
- 文件结束条件出现在输入序列中(在这种情况下
setstate(eofbit)被执行)- 下一个可用字符 c 是分隔符,由 确定
Traits::eq(c, delim)。分隔符被提取(与basic_istream::get() 不同)并计入 gcount(),但不存储。count-1字符已被提取(在这种情况下setstate(failbit)被执行)。
强调我的。
cin.getline(line1,7);
// ^ This is count
Run Code Online (Sandbox Code Playgroud)
只能读取 6 个字符,第 7 个字符保留为空终止符。“oranges”是七个字符,它cin处于不可读取的错误状态,在继续读取之前必须清除该错误状态。读取第二行
cin.getline(line2,7);
Run Code Online (Sandbox Code Playgroud)
立即失败并且没有读取数据。
显而易见的解决方案是
cin.getline(line1, sizeof(line1));
Run Code Online (Sandbox Code Playgroud)
充分利用整个阵列。但...
任何 IO 事务都应进行成功测试,因此
if (cin.getline(line1, sizeof(line1)))
{
// continue gathering
}
else
{
// handle error
}
Run Code Online (Sandbox Code Playgroud)
是更好的选择。
更好的是使用std::getline并std::string几乎消除大小限制。