我有一个C ++程序。我想从用户那里获得一个数字(t
),并强制用户输入行t
次,但是该程序的执行在1次迭代后终止。这是代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int t;
cin >> t;
for (int i=0; i< t; i++) {
getline(cin, str);
cout << str;
}
return 0;
}
谁能解释我为什么会这样以及如何解决?谢谢我的朋友们。
当您输入第一个字符(重复的时间)时,cin
缓冲区中将保留一个字符-cin >>
不会占用换行符。结果,getline(cin, str)
读取此字符并将其作为第一个输入,然后清空缓冲区并让您输入其他字符。
You can clear the buffer with std::cin.ignore(1);
删除该结尾字符-这可使您的代码按预期运行。但是,为什么不只使用std::cin.ignore(1);
呢?这样就解决了问题,并且避免了调用cin >> str
。
getline
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
int t;
cin >> t;
//clear one character out of buffer
cin.ignore(1);
//note that 1 is used for demonstration purposes
//in development code, INT_MAX, numeric_limits<streamsize>::max(),
//or some other large number would be best, followed
//by std::cin.clear()
for (int i=0; i< t; i++) {
cout << "input: ";
//you could use cin >> str; instead of getline(cin, str);
getline(cin, str);
cout << "got: " << str << std::endl;
}
return 0;
}
Demo时,换行符仍在缓冲区中,因此您读取的下一行将为空白。当您混合使用格式化输入(cin >> t
)和未格式化(>>
)时,经常会遇到这种情况,并且在切换到未格式化输入时需要采取措施。补救措施示例:
std::getline