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

标签 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);
}

最佳答案

status 是单个字符,但您将字符串存储到其中,从而有效地进行越界访问( undefined behaviour )。将其更改为数组,然后您就可以复制。

struct scholor
{
    char name[25];
    int  sem;
    int marks;
    char status[128];    
};

并调整调用和传递(因为 status 现在是一个数组 - 当传递给函数时,它的名称会转换为其第一个元素的指针):

  scanf("%s%d%d%s",s1.name,&s1.sem,&s1.marks,s1.status);
  sanction(s1.marks,s1.status);
  printf("%s",s1.status);

其他建议:
1. 对 main 使用标准原型(prototype),例如:int main(void)
2. 您可以使用strcpy来复制字符串,而不是自己做。

关于c - 为什么更新的结构变量不打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31017880/

相关文章:

c - ipv6 的 UDP 校验和验证 : how to fetch ipv6 source address from auxilliary data

c - C 中的 fork 线程正在互相写入标准输出

C : mark the every struct, union ,数组元素

无法使用 Arduino Uno 使用 RF 433 MHz 发射器发送消息

c - 如何为自己的文件格式创建标题?

c++ - 如何将 "\327\220\327\250\327\225\327\236"转换为希伯来语?

c - 使用 dyn.load 在 R x64 中加载已编译的 c 代码的问题

c - 函数指针 typedef 的前向声明

c - 在 C 中重复数组

c - SWIG:结构字段的 "out"类型映射需要访问相同结构的另一个字段