首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for循环中使用getline()后很难获得双重

在for循环中使用getline()后很难获得双重
EN

Stack Overflow用户
提问于 2020-04-13 23:49:24
回答 1查看 29关注 0票数 0

我正在尝试创建一个程序,它获取名称和测试分数,并将它们放在单独的向量中。我使用getline(),这样我就可以同时获得名字和姓氏。但是,每当我使用下面的代码时,第一个后面的每个名称都会丢失它的第一个字母。因此,如果输入的名字是约翰史密斯,简史密斯,雅各布史密斯等。程序输出约翰史密斯,安史密斯,阿科布史密斯,……我试着取出cin.ignore(),但是程序在第一个条目之后一直运行。我还尝试创建单独的函数来获取姓名和分数,但这也不起作用。如果有任何建议或帮助,我们将不胜感激。

代码语言:javascript
复制
int main() {
string test_taker;
int num_of_students = 0;
cout << "How many students took the exam? ";
cin >> num_of_students;
int starting = 0;
vector <double> score_list_us(num_of_students);
vector <string> name_list_us(num_of_students);
vector<double> score_list_sorted(num_of_students);
vector<string> name_list_sorted(num_of_students);
for (int i =0; i < num_of_students; i++) {
    cout << "Student #" << i + 1 << " Name: ";
    cin.ignore();
    getline(cin, name_list_us[i]);
    cout << "Student #" << i + 1 << " Score: ";
    cin >> score_list_us[i];
    cin.ignore();
}...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-14 00:49:51

问题:缺少角色

看到cin.ignore();就在getline(cin, name_list_us[i]);前面了吗?猜猜它能做什么。

在第一个循环中,cin.ignore();每隔一次通过循环吃掉cin >> num_of_students;留下的换行符,因此它会吃掉部分数据。

解决方案

如果您不能完全避免使用ignore(),请始终在操作结束后放进您想要的垃圾。如果将ignore()放在另一个操作之前,那么迟早会在流中没有垃圾的情况下执行该操作。在这种情况下,你打得更快。

接下来,您希望ignore()所有内容,直到并包括换行符。用户在输入后输入的任何内容都是垃圾,应该被丢弃。否则,ignore()会取出一个空格字符或同样无用的东西,留下换行符让getline跳过。我将把它留给解释你需要做什么的一个老朋友。

具体来说,使用

代码语言:javascript
复制
cin.ignore(numeric_limits<streamsize>::max(), '\n');

所以

代码语言:javascript
复制
int main() {
    string test_taker;
    int num_of_students = 0;
    cout << "How many students took the exam? ";

    cin >> num_of_students;
    // ignore after
    cin.ignore(numeric_limits<streamsize>::max(), '\n');


    int starting = 0;
    vector <double> score_list_us(num_of_students);
    vector <string> name_list_us(num_of_students);
    vector<double> score_list_sorted(num_of_students);
    vector<string> name_list_sorted(num_of_students);
    for (int i =0; i < num_of_students; i++) {
        cout << "Student #" << i + 1 << " Name: ";
        // not before
        getline(cin, name_list_us[i]);
        cout << "Student #" << i + 1 << " Score: ";
        cin >> score_list_us[i];
        // because this guy eats the newlines
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61198593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档