我遇到了C ++结构的问题。在我的下面的程序中,我试图从文件中读取考试的问题数量,考试答案以及学生考试答案的文件。这一切都有效,但是当我尝试将学生的信息放入结构的数组中时,变量id由于某种原因不起作用。编译器是Microsoft Visual Studio 2017 RC,它说“students-> id [i]”有一个错误,上面写着:“表达式必须有指向对象类型的指针”,我不知道为什么。我标记了问题所在并取消了剩下的代码,我所拥有的只是函数calculateGrade。我已经在这方面工作了一段时间,如果不解决这个问题就无法实现。任何帮助表示赞赏!
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct studentInfo {
int id;
string firstName;
string lastName;
string exam;
};
double calculateGrade(struct studentInfo);
int main() {
const int SIZE = 12;
studentInfo students[SIZE];
string fileName, key, studentFile;
ifstream file, fileForStudents;
int numOfQuestions, i = 0, id;
cout << "Please enter a file name: ";
cin >> fileName;
file.open(fileName);
if (!file.is_open()) {
cout << "Could not open file";
}
file >> numOfQuestions >> key >> studentFile;
fileForStudents.open(studentFile);
if (!fileForStudents.is_open()) {
cout << "Could not open file";
}
while (!fileForStudents.eof()) {
fileForStudents >> id >> students->firstName[i] >> students->lastName[i] >> students->exam[i];
students->id[i] = id; //issue is here
i++;
}
calculateGrade(students[SIZE]);
return 0;
}
答案 0 :(得分:2)
你只是把索引放错了地方 - 它应该是students[i].firstName
而不是students->firstName[i]
等等,因为students
是数组。
此行也不正确:
calculateGrade(students[SIZE]);
它可能会编译,但你会有超出界限访问的UB。如果您需要传递整个数组,则将指针传递给第一个元素和大小,但最好使用std::vector
或std::array
并通过引用传递它。
所以对于其他问题,为什么这样的代码:
students->firstName[i]
编译,首先students
是一个C样式数组,它可以隐式衰减到指向第一个元素的指针,因此students->firstName
等于students[0].firstName
然后students->firstName[i]
等于students[0].firstName[i]
将从字符串中访问第i个符号。
因此使用std::vector
还有另一个原因 - 您的表达式students->firstName[i]
无法编译,也不会提供错误表达,表明此类代码是正确的。
答案 1 :(得分:2)
students->id
只是一个int
,它不是数组,因此您无法使用students->id[i]
。
数组为students
,因此它应为students[i].id
。您不使用->
,因为students
是一个结构数组,而不是一个指针数组。