You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言结构体赋值类型不兼容错误排查及代码差异解析求助

C语言结构体赋值类型不匹配错误解析

我是一名编程初学者,完成作业时遇到问题。运行第一段C语言代码时出现如下编译错误,但第二段代码能正常运行,搞不懂两段的差异,恳请解析问题所在。

编译错误信息

Syntax Error(s)
__tester__.c: In function ‘main’:
__tester__.c:64:7: error: incompatible types when assigning to type ‘struct jatekok’ from type ‘float’
 csere = tarsas[i].ertekeles;
       ^
__tester__.c:66:20: error: incompatible types when assigning to type ‘float’ from type ‘struct jatekok’
 tarsas[j].ertekeles=csere;

第一段报错代码

#include <stdio.h>

struct jatekok{
  char nev[50];
  int ev;
  float ertekeles;
  int min;
  int max;
  
}csere;


int main()
{
    struct jatekok tarsas[8];
    
     for(int i=0; i<8; i++)
    {
        scanf("%s %d %f %d %d", tarsas[i].nev, &tarsas[i].ev, &tarsas[i].ertekeles, &tarsas[i].min, &tarsas[i].max);
        
    }
    
    printf("A beolvasott adatok:\n");
    for(int i=0; i<8; i++)
    {
       printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n", tarsas[i].nev, tarsas[i].ev, tarsas[i].ertekeles, tarsas[i].min, tarsas[i].max); 
    }
    
    printf("\n");
    printf("Az 5 fovel jatszhato jatekok:\n");
    
    for(int i=0; i<8; i++)
    {
        if(tarsas[i].max>=5)
        {
            printf("%s\n", tarsas[i].nev);
            
        }
        
    }
    
    int regi=2040;
    int index =0;
    for(int i=0; i<8; i++)
    {
        if(tarsas[i].ev<regi)
        {
            regi=tarsas[i].ev;
            index=i;
        }
    }
    printf("\n");
    printf("A legregebbi jatek: ");
    printf("%s\n", tarsas[index].nev);
    
     printf("\n");
    printf("A rendezett jateklista:\n");
    
   struct jatekok csere;
   for(int i=0;i<7;i++)
for(int j=i+1;j<8;j++)
if(tarsas[i].ertekeles<tarsas[j].ertekeles)
{
csere = tarsas[i].ertekeles;
tarsas[i].ertekeles=tarsas[j].ertekeles;
tarsas[j].ertekeles=csere;
}

for(int i=0; i<8; i++)
    {
       printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n", tarsas[i].nev, tarsas[i].ev, tarsas[i].ertekeles, tarsas[i].min, tarsas[i].max); 
    }
    
    
    return 0;
}

第二段可正常运行代码

#include <stdio.h>

struct jatek{
    char nev[50];
    int ev;
    float ertekeles;
    int minjatekos;
    int maxjatekos;
};
int main(){
    struct jatek Jatekok[8];
    printf("A beolvasott adatok:\n");
    for (int i=0;i<8;i++){
        scanf("%s %d %f %d %d",Jatekok[i].nev,&Jatekok[i].ev,&Jatekok[i].ertekeles, &Jatekok[i].minjatekos, &Jatekok[i].maxjatekos);
        printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n",Jatekok[i].nev,Jatekok[i].ev,Jatekok[i].ertekeles, Jatekok[i].minjatekos, Jatekok[i].maxjatekos);};

    printf("\nAz 5 fovel jatszhato jatekok:\n");

    for (int i=0;i<8;i++)
        if (Jatekok[i].maxjatekos>=5 && Jatekok[i].minjatekos <=5)
            printf("%s\n",Jatekok[i].nev);

    int minev = Jatekok[0].ev;
    for (int i=0;i<8;i++)
        if (Jatekok[i].ev<= minev)
        minev = Jatekok[i].ev;
    for (int i=0;i<8;i++)
        if (Jatekok[i].ev == minev){
            printf("\nA legregebbi jatek: %s\n\nA rendezett jateklista:\n",Jatekok[i].nev);
            break;};

    struct jatek temp;
    for (int i=0;i<7;i++)
        for (int j=i+1;j<8;j++)
            if (Jatekok[i].ertekeles < Jatekok[j].ertekeles){
                temp = Jatekok[i];
                Jatekok[i] = Jatekok[j];
                Jatekok[j] = temp;};
    for (int i=0;i<8;i++)
        printf("%s (%d): ertekeles: %.1f, jatekosok szama: %d-%d\n",Jatekok[i].nev,Jatekok[i].ev,Jatekok[i].ertekeles, Jatekok[i].minjatekos, Jatekok[i].maxjatekos);
    
}

问题核心差异解析

两段代码的关键区别在排序逻辑的变量类型与赋值操作:

  1. 第一段代码的错误原因:
    你在排序部分声明了struct jatekok csere;——这是一个完整的结构体变量,但你却试图用它存放float类型的tarsas[i].ertekeles(评分字段)。C语言不允许不同类型的变量直接赋值:

    • csere = tarsas[i].ertekeles;:把float值赋值给结构体变量,类型不匹配
    • tarsas[j].ertekeles=csere;:把结构体变量赋值给float字段,类型不匹配
      这就是编译报错的直接原因。
  2. 第二段代码的正确逻辑:
    排序部分声明了struct jatek temp;(同类型结构体变量),然后直接交换整个结构体实例:

    temp = Jatekok[i];
    Jatekok[i] = Jatekok[j];
    Jatekok[j] = temp;
    

    C语言允许同类型的结构体直接赋值,这样操作会把结构体的所有字段一起交换,既符合语法规则,也实现了按评分排序的需求。

  3. 额外提示:如果你的需求只是通过ertekeles字段排序,但不想交换整个结构体,可以把csere声明为float类型,这样就能正确存放评分值来交换单个字段了。

内容的提问来源于stack exchange,提问作者carlostevez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:25:38