以下是代码。它包含一个结构学生,其中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';
}
}
谢谢。
答案 0 :(得分:2)
您的问题是使用>>
流运算符,然后使用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);
}
答案 1 :(得分:0)
尝试在获取 int 类型之后添加cin.ignore()
并在获取 char 类型之前
要获得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的组合。