如何摆脱领先的' '和' \ n'当我不确定我会在获取线之前得到一个cin时的符号?
示例:
int a;
char s[1001];
if(rand() == 1){
cin >> a;
}
cin.getline(s);
如果我在getline之前放置了一个cin.ignore(),我可能会丢失该字符串的第一个符号,所以在我每次使用&c;>>&#39后我唯一的选择就是它; ?因为当你在一个大项目上工作时,这不是一个非常有效的方法。
有没有比这更好的方法:
int a;
string s;
if(rand() == 1){
cin >> a;
}
do getline(cin, s); while(s == "");
答案 0 :(得分:2)
像这样:
std::string line, maybe_an_int;
if (rand() == 1)
{
if (!(std::getline(std::cin, maybe_an_int))
{
std::exit(EXIT_FAILURE);
}
}
if (!(std::getline(std::cin, line))
{
std::exit(EXIT_FAILURE);
}
int a = std::stoi(maybe_an_int); // this may throw an exception
您可以通过几种不同的方式解析字符串maybe_an_int
。您还可以使用std::strtol
或字符串流(在与第一个if
块相同的条件下):
std::istringstream iss(maybe_an_int);
int a;
if (!(iss >> a >> std::ws) || iss.get() != EOF)
{
std::exit(EXIT_FAILURE);
}
您当然可以更优雅地处理解析错误,例如通过在循环中运行整个事物直到用户输入有效数据。
答案 1 :(得分:0)
空格字符和换行符都被标准IOStream分类为空格。如果要将格式化的I / O与未格式化的I / O混合,并且需要清除剩余空白流,请使用std::ws
操纵器:
if (std::getline(std::cin >> std::ws, s) {
}