我的代码是为了获取学生的姓名和学生成绩。之后,我尝试从我制作的结构中打印学生姓名,我只能打印成绩。尝试使用
打印字符串时出错printf("%s", test[0].names);
错误说,
StudentNamesAndGrades.exe中0x0fe113af(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突读取位置0x65736f4a。
但是当我使用
时printf("%d", test[0].studentScores);
打印出第一个学生的分数。这是整个代码,因为它可能不是我尝试打印出来的方式。
#include <stdio.h>
#include <string>
/*
this program will get a name of students
and then you will enter the grade for each one :)
*/
struct students
{
char *names;
int studentScores;
};
int main(void)
{
int numStudents = 0;
students *test;
int i;
printf("Enter the number of students in your class: ");
scanf("%d", &numStudents);
test = (students*)malloc(numStudents * sizeof(students));
printf("Enter the names of the %d students\n", numStudents);
for (i = 0; i < numStudents; i++)
{
printf("Enter the name of student %d: ", i + 1);
scanf("%s", &test[i].names);
printf("Enter the students score: ");
scanf("%d", &test[i].studentScores);
}
printf("%d", test[0].studentScores);
printf("%s", test[0].names); // This is where I get a problem :/
return 0;
}
答案 0 :(得分:4)
在完全接受输入时,您没有为char *names;
分配内存。
你的结构可能像:
typedef struct students
{
char names[30];
int studentScores;
}students;
使用fgets
比使用scanf更安全。
答案 1 :(得分:1)
您需要为names
字段分配空间,但我建议采用不同的方法
struct students
{
char names[100];
int studentScores;
};
然后将scanf()
更改为
scanf("%99s", test[i].names);
你的第一个scanf()
中有另一个错误,你将地址传递给指针,而不是指针。
您应该使用&
运算符的地址作为整数,因为您需要将指针传递给"%d"
说明符的整数,但您的names
字段变量已经是指针,所以不要拿它的地址。
您可能感兴趣的其他一些提示
不要强制转换malloc
的结果,虽然你似乎错误地使用c ++编译器来编译c代码,而在c ++中你需要使用强制转换,但是你不需要,它会让您的代码更难阅读以及您可以使用Stack Overflow上最受欢迎的c问题阅读的其他问题。
检查来自malloc
的返回值,它不会失败的可能性无关紧要,因为它理论上可能会失败,你必须检查它的返回值,失败时NULL