如何获得n次字符串输入? [重复]

问题描述 投票:0回答:2

我有一个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;
}

谁能解释我为什么会这样以及如何解决?谢谢我的朋友们。

c++ for-loop getline
2个回答
2
投票

当您输入第一个字符(重复的时间)时,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; }


3
投票

Demo时,换行符仍在缓冲区中,因此您读取的下一行将为空白。当您混合使用格式化输入(cin >> t)和未格式化(>>)时,经常会遇到这种情况,并且在切换到未格式化输入时需要采取措施。补救措施示例:

std::getline
© www.soinside.com 2019 - 2024. All rights reserved.