问题描述
这是我在这里的第一个问题,我仍在学习 c,我正在编写此代码以输入用户银行帐户的详细信息以归档并从文件中读取所有记录,当出现错误时, 错误:一元“*”的无效类型参数(有“int”)出现在所有指向 struct *ptr 的指针指向整数值的行上(例如第 40 行)
struct usr_act
{
char username[24],address[24],status;
int id,prebal,cp,newbal,pdate;
}a[3];
int j=0;
struct usr_act *ptr;
bool r;
void input()
{
FILE *fp;
fp = fopen("accounts.txt","a+");
if(fp==NULL)
{
printf("Error!!");
exit(1);
}
printf("\n\tRecord %d\n\n",j+1);
fprintf(fp,"Record",j+1);
printf("\nName:- ");
for(int i=0;i<24;i++)
{
scanf("%c",ptr->username[i]);
}
fprintf(fp,"Name:- %s",*(ptr->username));
printf("\nAddress:- ");
for(int i=0;i<24;i++)
{
scanf("%c",ptr->address[i]);
}
fprintf(fp,"Address:- %s",*(ptr->address));
printf("\nCustomer Id:- ");
scanf("%d",ptr->id);
fprintf(fp,"Customer Id:- %d",*(ptr->id)); //Error
printf("\nPrevIoUs balance:- ");
scanf("%d",ptr->prebal);
fprintf(fp,"PrevIoUs Balance:- %d",*(ptr->prebal)); //Error
printf("\nCurrent Payment:- ");
scanf("%d",ptr->cp);
fprintf(fp,"Current Payment:- %d",*(ptr->cp)); //Error
printf("\nPayment Date:- ");
scanf("%d",ptr->pdate);
fprintf(fp,"Payment Date:- %d",*(ptr->pdate)); //Error
fclose(fp);
r=true;
}
void calc()
{
FILE *fp;
fp = fopen("accounts.txt","a+");
if(fp==NULL)
{
printf("Error!!");
exit(1);
}
float k;
k = 0.10 * (*(ptr->prebal));
if(*(ptr->cp)>0 && *(ptr->cp)<k)
{
ptr->status='o';
}
else
{
ptr->status='c';
}
fprintf(fp,"Account status:- %c",*(ptr->status));
ptr->newbal= *(ptr->prebal) - (*(ptr->cp));
fprintf(fp,"New Balance:- %d",*(ptr->cp));
fclose(fp);
}
在两者之间我有一个显示功能,它显示文件中的数据,这是主要功能
int main()
{
int l;
do
{
ptr=&a[j];
r=false;
printf("\n\tMenu\nk=1,Input details \nk=2,Show patient records \nk=3,Exit \n\nEnter your choice:- ");
scanf("%d",&l);
switch(l)
{
case 1:
{
input();
calc();
break;
}
case 2:
{
display();
break;
}
}
if(r==true)
{
j=j+1;
}
} while(l!=3);
return 0;
}
我该如何解决这个问题?
解决方法
对于您在第 40 行引用的示例,您需要像这样将参数的地址传递给 scanf()
:
scanf("%d",&ptr->id);
这是因为 scanf()
需要在给定的变量中存储一个新值,但是因为 C 使用按值传递约定进行参数传递,所以需要指向变量的指针。
如果您仔细阅读编译器日志,gcc 编译器会逐字地为您指出错误的确切位置:
错误:一元'*'的类型参数无效(有'int')
此消息旨在说明“您对一元 '*' 运算符的参数类型无效,您为其指定了一个没有意义的 'int'。然后在错误文本下方您会看到:
fprintf(fp,"Customer Id:- %d",*(ptr->id)); // Error
^~~~~~~~~~
这里的 ^~~~~~~~~~
"ASCII art" 是一个下划线,指出有问题的表达式 *(ptr->id)
而 ^
是一个箭头,指出了它的确切位置错误。