结构错误格式的C编程指针

时间:2018-01-29 13:48:44

标签: c pointers

我是编程新手,刚刚学习了C语言的指针。我尝试编译我的代码并出现以下错误。

格式%s需要char *类型的参数,但参数2的类型为int。

printf("%s",S[i]->name[i]);

此错误出现在以下代码的案例3中。

如果有人能帮助我,我将非常感激。

#include <stdio.h>
struct student{   
    char name[100];
    int stdno[100];
    float mark[100];
};

int main() {
    struct student *S[100];
    int NoS,NoC,choice,i,j,stdno;

    printf("enter the total number of students \n");
    scanf("%d",&NoS);
    printf("Enter no of courses\n");
    scanf("%d",&NoC);

    while(1)
    {
        printf("1.introduce new student\n");
        printf("2.introduce new mark\n");
        printf("3.print report of all students\n");
        printf("4.exit\n");
        scanf("%d",&choice);

        switch(choice)
        {
        case 1:
            for(i=0;i<NoS;i++)
            {
                printf("student no: ");
                scanf("%d",&S[i]->stdno[i]);
                printf("student name: ");
                scanf("%s",&S[i]->name[i]);
            }
            break;

        case 2:
            for(j=0;j<NoC;j++)
            {
                printf("enter the marks of course_%d for all students: ",j);
                for(i=0;i<NoS;i++)
                {
                    scanf("%f",&S[i]->mark[j]);
                }
            }
            break;


        case 3:
            printf("Student No\tName\t");
            printf("\n");
            for(i=0;i<NoS;i++)
            { 
                printf("%d\t\t",S[i]->stdno[i]);
                printf("%s",S[i]->name[i]);
                for(j=0;j<NoC;j++)
                {
                    printf("\t\t%f",S[i]->mark[j]);
                }
                printf("\n"); 
            }
            printf("\n"); 
            break;

        case 4: 
            return 0;

            break;
        }   
    }
}

1 个答案:

答案 0 :(得分:1)

S[i]->name[i] name中是一个char数组,因此name[i]是一个字符。

当作为参数被推送到堆栈时,char被转换为int,因此编译器抱怨“但是参数2的类型为int”。

使用:S[i]->name

<小时/> 请注意代码中的重要错误:

struct student *S[100];

这是一个由100个学生组成的数组。 但是没有分配给学生的存储空间

在阅读每个学生时,您应该分配一名学生,例如

    S[i]= malloc(sizeof(struct student));

<小时/> 在案例1中:

    scanf("%s",&S[i]->name[i]);

此处name也是一个char数组,所以不要索引并删除第一个&,因为编译器已经传递了char数组的地址。你应该使用:

    scanf("%s",S[i]->name);

案例3:

    printf("%s",S[i]->name[i]);

应该是

    printf("%s",S[i]->name);