为什么更新结构变量不打印

时间:2015-06-24 04:51:58

标签: c

这是我的代码,如果学生分数大于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);
}

2 个答案:

答案 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);
}