【问题标题】:Reading two line continuously using getline function in c++在c ++中使用getline函数连续读取两行
【发布时间】:2019-11-26 23:24:13
【问题描述】:

我正在学习如何使用 getline 函数读取字符串。

我知道 getline 函数读取字符串,只要我们不按回车键或 getline 参数中的大小值交叉。就我尝试使用 getline 函数读取一行字符串而言,我没有遇到任何问题。

但是当我试图在两个不同的 char 数组中一个接一个地读取两行字符串时,我得到了我没想到的输出。 要理解我的问题,请遵循以下几行

#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;
}

当我运行上面的程序时,它要求我输入,然后我给了橙色作为第一个输入并点击了输入按钮。

接下来它要求我输入第二个输入。然后我输入香蕉并点击输入按钮。在这种情况下,它会产生我预期的结果。但是如果输入橙子作为第一个输入,它不会等待我输入第二个输入。

因此 line1 存储橙色但 line2 保持空白。 现在我的问题是 line1 存储橙色没有错。但我不明白为什么 line2 保持空白不应该包含 line1 输入后剩余的数据我的意思是 line2 不应该包含 s 作为值。

因为橙色是一个 6 位数字,所以 getline 将存储前六位数字,然后在我设置 Geline 7 的大小时添加一个空字符。

然后其他剩余数据将在下一次调用 getline 函数时分配。因此不应存储在 line2 中,因为在第一次读取 new_line 字符之后。

为什么 line2 会保持空白,为什么在给出第一个输入后屏幕不会停止输入?

【问题讨论】:

  • 能否请您清理构成您问题大部分的大段以便我们阅读?
  • okk.i 试图让它简短。但我认为最好对我的问题进行完整描述
  • 你明白cin.getline 的第二个参数是做什么的吗? (轻推:尝试在第 1 行输入 marmalade。)
  • getline 的语法有点奇怪。你想用第二个参数7做什么?
  • 很像代码,可读性将受益于结构和空白。无论如何,当您指定最多读取 7 个字符时,您期望会发生什么?当您读取oranges 时,即为 7,因此不会读取返回字符。它将被下一个getline 拾取,它只会读取返回并认为它是一个空字符串。

标签: c++ getline


【解决方案1】:

std::istream::getline 正在过载数据。

According to cppreference,

表现为UnformattedInputFunction。在构造并检查哨兵对象后,从 *this 中提取字符并将它们存储在第一个元素由 s 指向的数组的连续位置中,直到发生以下任何一种情况(按所示顺序测试):

  • 文件结束条件出现在输入序列中(在这种情况下,setstate(eofbit) 被执行)
  • 下一个可用字符 c 是分隔符,由 Traits::eq(c, delim) 确定。分隔符被提取(与 basic_istream::get() 不同)并计入 gcount(),但不存储。
  • count-1 字符已被提取(在这种情况下,setstate(failbit) 被执行)。

强调我的。

cin.getline(line1,7);
//                ^ This is count

只能读取 6 个字符,第 7 个字符保留为空终止符。 "oranges" 是七个字符,这会将cin 置于不可读取的错误状态,在继续读取之前必须清除该错误状态。读第二行

cin.getline(line2,7);

立即失败,没有数据被读取。

显而易见的解决方案是

cin.getline(line1, sizeof(line1));

利用整个数组。但是……

任何 IO 事务都应该测试是否成功,所以

if (cin.getline(line1, sizeof(line1)))
{
    // continue gathering 
}
else
{
    // handle error
}

是更好的选择。

最好还是使用std::getlinestd::string 来几乎消除大小限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多