打破 main :
int main(void)
{
char myStr[50];
cin.ignore (std::numeric_limits<:streamsize>::max(),'\n');
一个坏主意,但你已经注意到了 . 流中必须有换行符,或者您坐等等 . 如果用户不期望这种行为,您可能会等待很长时间并且让用户感到沮丧 . 这是一个糟糕的场景 .
cout<
cin>>myStr;
也是一个坏主意,但出于不同的原因 . >> 不知道它应该停止在49个字符以防止溢出 myStr . 在第50个角色发生了不好的事情 .
// After reading remove unwanted characters from the buffer
// so that next read is not affected
cin.ignore (std::numeric_limits<:streamsize>::max(),'\n');
这个是安全的 . >> 不会消耗换行符或任何其他空格,并且为了让流从控制台移交数据,必须有人输入并提供换行符 .
}
一般的经验法则是 ignore ,除非你有理由 ignore ,如果你有理由,请立即忽略 . 不要等到下一个流操作到 ignore 之前,如果这个操作是第一个的话会导致什么?或者之前的操作没有给 ignore 留下任何东西? ignore 在流程中留下您想要的内容 ignore d . 所以
std::string getfirstword()
{
std::string firstword;
if (std::cin >> firstword)
{
cin.ignore (std::numeric_limits<:streamsize>::max(),'\n');
return firstword;
}
return ""; // or perhaps
// throw std::runtime_error("There is no first word.");
// is more appropriate. Your call.
}
很好,但是
std::string getfirstword()
{
cin.ignore (std::numeric_limits<:streamsize>::max(),'\n');
std::string firstword;
if (std::cin >> firstword)
{
return firstword;
}
return "";
}
在一切圣洁的眼中是一种冒犯 . 不要这样做 .
至于 getline ,它得到了一条线 . 所有这一切直到文件末尾或行尾,以先到者为准 . 它也为你吃掉了最后一行,所以你不必担心稍后会破坏你的醇厚的流线换行 .
如果您只想要部分线路,则必须将其分解 . 对此的典型用法是类似的
std::string line;
if (std::getline(std::cin,line))
{
std::istringstream istr(line);
std::string firstword;
if (istr >> firstword)
{
// do something with firstword
}
else
{
// there is no firstword. Do something else.
}
}
getline 读取所有内容,包括换行符 . 它's no longer in the stream, so I'd认为这是安全的 . 您不必担心垃圾堆在线路末端 . 不过,您可能不得不担心下一行 .