【问题标题】:GetLine to compare strings works once then the compare doesn't work afterGetLine 比较字符串一次有效,然后比较不起作用
【发布时间】:2020-03-27 15:29:47
【问题描述】:
while((addRemove == "R" || addRemove == "r") && continueLoop == true)
{

    for(int i = 0; i < choreVector.size(); i++)
    {
        if(choreVector[i] != "")
        {
            cout << choreVector[i] << endl;
        }

    }

    cout << endl;
    cout << "Enter value to add to remove from the list" << endl;
    cin.ignore();
    getline(cin, userValue);

    cout << endl;

    for(int j = 0; j < choreVector.size(); j++)
    {
        if(userValue == choreVector[j])
        {
            choreVector.erase(choreVector.begin() + j);
        }
    }

    cout << "Would you like to remove another item from the list(y/n)" << endl;
    getline(cin, userValue);
    cout << endl;

    if(userValue == "n" || userValue == "N")
    {
        continueLoop = false;
    }

}

所以我的问题是我在一个向量中有一个家务列表,其中包含以下项目的空格: “倒垃圾” 《遛狗》

我的问题是用户可以选择从键盘输入中删除向量,所以我一直在使用 getline 进行 cin 输入。 Getline 在第一次运行时可以完美地删除任何元素,但在第二次运行时失败,并且在删除第一次后不会删除元素。我在 GetLine 之前有 cin.ignore,据我所知,它清除了缓冲区,并会忽略以前 cin 中的任何数据。

可能是我忽略了一些愚蠢的事情,但如果有人可以提供帮助,那就太好了。

【问题讨论】:

  • cin.ignore(); 不会“清除缓冲区”。它从待处理的输入流中消耗并丢弃 one 字符,如果eof 状态被触发,则中止该工作,如果是这种情况,后续的读取请求将自动没有中间的clear()失败。 永远不要假设您的输入操作成功。您注定迟早会假设错误(通常在最不合时宜的时候,例如当教授或更糟糕的是付费客户正在运行您的代码时)。
  • 删除cin.ignore()
  • @jackw11111 我已经尝试过了,但是读取根本不会从向量中删除

标签: c++ getline


【解决方案1】:

据我所知,问题似乎出在您的 IDE 上。典型的 IDE 将具有某种配置为显示窗口输出的“输出”或“消息”选项卡,因为它已被自动配置为将编译器的输出通过管道传输到此窗口。根据您的 IDE,它们可能支持也可能不支持此窗口中的输入。在最坏的情况下,输入可能非常错误,一半工作,一半损坏。我通常假设我使用的任何 IDE 都不支持在该窗口中输入,并且会在命令行/终端上手动编译程序,或者我知道 code::blocks 和 Visual Studio 打开一个控制台窗口,它支持用户输入和输出,并确保使用它。

【讨论】:

  • 每当我在 getline 之前不使用 cin.ignore() 语句时,getline 都会被忽略并且程序会跳过它。这就是为什么我一开始就有它的原因
  • Repl.it。我会在 Vis Studio 中尝试一下,看看是否有效
  • 如果可以的话可以用命令行试试吗?我使用的一般经验法则是,如果我知道我的程序需要输入,我会在命令行上编译。
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 2014-04-03
  • 2012-01-22
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多