【问题标题】:Program terminates before reading all struct members程序在读取所有结构成员之前终止
【发布时间】:2016-04-13 00:14:39
【问题描述】:

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

#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';
    }
}

谢谢。

【问题讨论】:

  • 对我来说似乎工作正常,您是否尝试使用 valgrind 运行它?

标签: c++ string struct


【解决方案1】:

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

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

因此,您的 read in 循环应该使用 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);
}

【讨论】:

  • 感谢您的解释! max_int 应该大于 rno 中的位数,对吗?即它应该大于no。之前输入的字符数?
  • 是的,如果它是在我使用的系统上定义的,我只使用 MAX_INT。我不确定是否所有系统都定义了它。但如果需要,您也可以使用标准库中的 numeric_limits。
【解决方案2】:

尝试在获取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 的组合。

参见documentation 和这个question

【讨论】:

  • 为什么我们需要gets 而不是getline
  • 为描述@Tim修改了答案
  • 我认为对于新手用户@Steephen gets() - gets_s() - puts() 而不是像getline() 这样的高级功能,它简单易懂
  • gets 不采用 std::string 作为参数,在 C++11 中已弃用
猜你喜欢
  • 2021-06-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多