我似乎无法从结构中打印出一个字符串,但我可以打印一个整数

时间:2015-01-23 01:55:27

标签: c

我的代码是为了获取学生的姓名和学生成绩。之后,我尝试从我制作的结构中打印学生姓名,我只能打印成绩。尝试使用

打印字符串时出错
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;
}

2 个答案:

答案 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字段变量已经是指针,所以不要拿它的地址。

您可能感兴趣的其他一些提示

  1. 不要强制转换malloc的结果,虽然你似乎错误地使用c ++编译器来编译c代码,而在c ++中你需要使用强制转换,但是你不需要,它会让您的代码更难阅读以及您可以使用Stack Overflow上最受欢迎的c问题阅读的其他问题。

  2. 检查来自malloc的返回值,它不会失败的可能性无关紧要,因为它理论上可能会失败,你必须检查它的返回值,失败时NULL