在cin>>之后阅读新行不起作用

时间:2016-11-30 11:00:44

标签: c++ c++11 io

我在处理从stdin读取的换行符时遇到问题:

cmake_minimum_required(VERSION 3.6)
project(test_lib)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
set(CMAKE_INCLUDE_CURRENT_DIR ON)


foreach(i RANGE 0 15)
  if(i LESS 10)
    set(target_name foo_v0${i})
  else()
    set(target_name foo_v${i})
  endif()
  add_library(${target_name} SHARED foo.cpp foo.h)
  target_compile_definitions(${target_name} PRIVATE X_VERSION=${i})
endforeach()

当我运行它时,maxelems上的cin和cin.ignore()的刷新工作。

当我到达时:

#include <iostream>
#include <string>
...

using namespace std;

int main() {

    ...

    unsigned int maxelems;

    cout << "Maximal number of elems that can be taken in one move: ";

    if (!(cin >> maxelems)) {

        cout << "Bye!" << endl;
        return 1;
  }

  string pl1_str;

  cin.ignore();

  cout << "Player 1 (hu=human, ra=random, opt=optimal):" << endl;

  if (!(getline(cin, pl1_str))) {

      cout << "Bye1!" << endl; return 1;

  }

  if(pl1_str =="hu")
        //do smth
    else if(pl1_str =="ra")
        //do smth
    else if(pl1_str=="opt")
       //do smth
    else {
        cout << pl1_str << "Bye2!" << endl; return 1;
    }

    ...
}

我输入:

Player 1 (hu=human, ra=random, opt=optimal):

似乎没有达到行尾。当我再次按Enter键时:

hu<Enter>

应用程序以&#34; Bye1!&#34;结束。这不是我想要的。

现在如果我插入另一个cin.ignore():

hu<Enter><Enter>

我输入:

...
cout << "Player 1 (hu=human, ra=random, opt=optimal):" << endl;
cin.ignore();
...

处理该行,但应用程序终止于:

hu<Enter>

好的,cin.ignore()削减了&#34; h&#34; ,但为什么线突然处理?我怎样才能分配&#34; hu&#34;到pl1_str?

修改:

我解决了这个问题。实际上没有问题: - )。

u Bye2!

我在代码中有另一个getline(),它检查相同的条件:

...
  if(pl1_str =="hu")
    //do smth
else if(pl1_str =="ra")
    //do smth
else if(pl1_str=="opt")
   //do smth
else {
    cout << pl1_str << "Bye2!" << endl; return 1;
}

...

当然,如果我进入:

string pl2_str;

if (!(getline(cin, pl2_str))) {

      cout << "Bye2!" << endl; return 1;

  }

//Here I forgot to insert:  cout << "Player 2 (hu=human, ra=random, opt=optimal):" << endl;

if(pl2_str =="hu")
    //do smth
else if(pl2_str =="ra")
    //do smth
else if(pl2_str=="opt")
   //do smth
else {
    cout << pl2_str << "Bye2!" << endl; return 1;
}

通过第二个getline()解析空字符串并返回代码。如果我咳嗽&#34; Bye3&#34;我早就注意到了。

0 个答案:

没有答案