我是编程新手,刚刚学习了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;
}
}
}
答案 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);