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

Program terminates before reading all struct members

本文关键字:成员 终止 结构 读取 程序      更新时间:2023-10-16

以下是代码。它包含一个结构体student,其中intrno和stringname为成员。我使用循环来读取所有学生变量的成员。但只要我输入任何字母,程序就会终止。此外,输入的字符串也不会显示。

#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 << "ROLLtNAMEn" << 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 (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 << "ROLLtNAMEn" << line << 'n';
    for( i = 0 ; i < 4 ; ++i)
        cout << s[i].rno << 't' << s[i].name << 'n';
}

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

请参阅文档和这个问题