我是以错误的方式使用结构吗?

时间:2014-03-10 03:09:02

标签: c struct

我遇到了这个奇怪而神秘的(至少对我来说)错误,我发现很难找到。它在我调用我的函数input(student_list1[MAX], &total_entries);的行中给出了一个错误,其中编译器说:

  

'input'中的文字1的不兼容类型

我在这里做错了什么?我感觉它非常简单和愚蠢,但我现在已经多次查看代码而没有任何效果。

#define MAX 10
#define NAME_LEN 15

struct person {
char name[NAME_LEN+1];
int age;
};

void input(struct person student_list1[MAX], int *total_entries);

int main(void)
{
    struct person student_list1[MAX];
    int total_entries=0, i;

    input(student_list1[MAX], &total_entries);

    for(i=0; i<total_entries; i++)
    {
        printf("Student 1:\tNamn: %s.\tAge: %s.\n", student_list1[i].name, student_list1[i].age);
    }

    return 0;
} //main end

void input(struct person student_list1[MAX], int *total_entries)
{
    int done=0;
    while(done!=1)
    {
        int i=0;
        printf("Name of student: ");
        fgets(student_list1[i].name, strlen(student_list1[i].name), stdin);
        student_list1[i].name[strlen(student_list1[i].name)-1]=0;

        if(student_list1[i].name==0) {
            done=1;
        }

        else {
            printf("Age of student: ");
            scanf("%d", student_list1[i].age);
            *total_entries++;
            i++;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

函数参数中的

struct person student_list1[MAX]实际上是指向struct person student_list1的指针。

您传递的

student_list1[MAX]是数组struct person student_list1[MAX]的(出界)成员。有效数组索引应在0MAX - 1之间。

将其更改为:

input(student_list1, &total_entries);

请注意,此处数组名称student_list1会自动转换为指向student_list1[0]的指针。

答案 1 :(得分:1)

代码有很多问题;这是我尝试使它更有力:

#include <stdio.h>
#include <string.h>

#define MAX 10
#define NAME_LEN 15

// use a typedef to simplify code
typedef struct person {
  char name[NAME_LEN];
  int age;
} person_t;

// size qualifier on student_list is redundent and person_t* does the same
void input(person_t *student_list, int *total_entries);

int main(void)
{
    person_t student_list[MAX];
    int total_entries, i;

    // pass array and not the non-existent 'student_list[MAX]' element
    input(student_list, &total_entries);

    for(i=0; i<total_entries; i++)
    {
        // age is an int, not a string so use %d
        printf("Student 1:\tName: %s.\tAge: %d.\n", student_list[i].name, student_list[i].age);
    }

    return 0;
} //main end

void input(person_t *student_list, int *total_entries)
{
    int done = 0, i = 0;

    *total_entries = 0;

    while (i < MAX) {
        printf("Name of student: ");

        // use NAME_LEN instead of strlen(list[i].name) because latter is
        // probably not initialized at this stage
        if (fgets(student_list[i].name, NAME_LEN, stdin) == NULL) {
            return;
        }
        // detect zero-length string
        if (student_list[i].name[0] == '\n') {
            return;
        }

        printf("Age of student: ");
        scanf("%d", &student_list[i].age);
        // read the newline
        fgetc(stdin);

        *total_entries = ++i;
    }
}

答案 2 :(得分:0)

input(student_list1[MAX], &total_entries);应为input(student_list1, &total_entries);

在C中,

void input(struct person student_list1[MAX], int *total_entries);

等于

void input(struct person *student_list1, int *total_entries);