这是我的代码,如果学生分数大于85,奖学金状态将更改为sanctioned
,但更新后不会打印
#include<stdio.h>
#include<string.h>
struct scholor
{
char name[25];
int sem;
int marks;
char status;
};
void sanction(int m, char *s)
{
if(m>85)
{
char p[15]="sanctioned";
char *r;
r=p;
while(*r!='\0')
{
*s=*r;
s++;
r++;
}
*s='\0';
}
}
int main()
{
struct scholor s1;
scanf("%s%d%d%s",&s1.name,&s1.sem,&s1.marks,&s1.status);
sanction(s1.marks,&s1.status);
printf("%s",s1.status);
}
答案 0 :(得分:2)
status
是一个单一的char,但是你将一个字符串存储在其中,有效地进行了越界访问(undefined behaviour)。将其更改为数组,然后您就可以复制。
struct scholor
{
char name[25];
int sem;
int marks;
char status[128];
};
并调整调用和传递(因为status
现在是一个数组 - 它的名称在传递给函数时被转换为指针t的第一个元素):
scanf("%s%d%d%s",s1.name,&s1.sem,&s1.marks,s1.status);
sanction(s1.marks,s1.status);
printf("%s",s1.status);
其他建议:
1.使用main
的标准原型,例如:int main(void)
你可以用strcpy
复制字符串,而不是自己动手。
答案 1 :(得分:1)
你的结构应该具有作为字符数组的状态而不是字符。当你扫描一个数组时,不要写&amp;因为名称本身指向第一个元素的assdress。您更正的程序是:
struct scholor
{
char name[25];
int sem;
int marks;
char status[16];
};
void sanction(int m, char *s)
{
if(m>85)
{
char p[15]="sanctioned";
char *r;
r=p;
while(*r!='\0')
{
*s=*r;
s++;
r++;
}
*s='\0';
}
}
int main()
{
struct scholor s1;
scanf("%s%d%d%s",s1.name,&s1.sem,&s1.marks,s1.status);
sanction(s1.marks,s1.status);
printf("%s",s1.status);
}