繁体   English   中英

程序在读取所有结构成员之前终止

[英]Program terminates before reading all struct members

以下是代码。 它包含一个以int rno和字符串名称为成员的struct 学生 我使用循环读取所有学生变量的成员。 但是,只要我输入任何字母,程序就会终止。 另外,输入的字符串也不会显示。

#include <iostream>
#include <string>

using namespace std;
int main() {
    struct student {
        int rno;
        string name;
    };

    student s[4];

    int i;
    for( i = 0; i < 4; ++i) {
        cin >> s[i].rno;
        getline( cin, s[i].name );
    }

    string line = "";
    for( i = 0; i < 80; ++i) line += '-';

    cout << line << "ROLL\tNAME\n" << line << '\n';

    for( i = 0; i < 4; ++i) {
        cout << s[i].rno << '\t' << s[i].name << '\n';
    }
}

谢谢。

您的问题是使用>>流运算符,然后使用getline而不刷新任何不需要的换行符的流。

然后,当您读取下一个结构时,您将拥有想要作为先前元素名称的字符串,并且流可能无法以整数读取(除非名称以数字开头)。

因此,您的读入循环应使用cin.ignore(MAX_INT,'\\n')或代替MAX_INT某些值长于您期望的任何行。

cin.ignore将忽略接下来的X个字符,或者直到它到达指定的字符(在这种情况下为MAX_INT字符,或者直到到达换行符'\\n' )为止。

您的for循环读操作将如下所示:

for (i = 0; i < 4; ++i){
    cin >> s[i].rno;
    cin.ignore(MAX_INT, '\n');
    getline(cin, s[i].name);
}

尝试在获取int类型之后并在获取char类型之前添加cin.ignore()

为了获得char数组,最好使用gets()

#include <iostream>
#include <string>
using namespace std;

struct student {
    int rno;
    string name;
};

int main() {
    student s[4];
    int i;
    for( i = 0 ; i < 4 ; ++i) {
        cin >> s[i].rno;
        cin.ignore();
        gets(s[i].name);
    }
    string line = "";
    for( i = 0 ; i < 80 ; ++i) line += '-';
    cout << line << "ROLL\tNAME\n" << line << '\n';
    for( i = 0 ; i < 4 ; ++i)
        cout << s[i].rno << '\t' << s[i].name << '\n';
}

cin将换行符留在流中。 cin.ignore()添加到下一行将清除/忽略流中的换行符。
这主要用于cin和getline的组合。

参见文档和这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM