程序在读取所有结构成员之前终止
Program terminates before reading all struct members
以下是代码。它包含一个结构体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的组合。
请参阅文档和这个问题
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 程序在读取所有结构成员之前终止