我在处理从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;我早就注意到了。