You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C语言报错:assignment to expression with array type 问题求助

解决C语言中"assignment to expression with array type"错误

咱们来一步步拆解你遇到的问题,这个错误的核心原因是C语言里数组类型的变量不能直接用=赋值——数组名本质是指向首元素的常量指针,没法直接把另一个字符串/数组通过赋值运算符塞进去。接下来咱们逐个修正代码里的问题:

1. 修正字符串初始化的错误

你写的char a={"a"};是错误的:a被定义为单个char类型,但你用字符串字面量初始化它,会导致类型不匹配。改成下面两种合法方式之一即可:

// 方式1:定义为可修改的字符数组
char a[] = "a";
// 方式2:定义为指向字符串常量的指针(若无需修改内容可选此方式)
const char *a = "a";

2. 替换数组赋值为字符串拷贝函数

既然不能直接用=给数组赋值,咱们需要用C标准库的字符串拷贝函数strcpy(追求安全性的话可以用strncpy,避免缓冲区溢出)。记得要先包含头文件#include <string.h>

另外你代码里的(*c).titulo是在操作数组c的第一个元素,循环变量i完全没发挥作用,这是逻辑错误!应该用c[i]访问循环中的当前元素,修正后的赋值代码如下:

strcpy(c[i].titulo, a);
strcpy(c[i].autor, a);

3. 修正文件打开的赋值错误

你写的f == fopen("bib.dat", "wb");用了比较运算符,不是赋值!这会导致f一直处于未初始化状态,正确写法是用赋值运算符=

f = fopen("bib.dat", "wb");

4. 修正文件写入的逻辑

你当前循环里每次都把整个c数组写入文件,最终文件会重复存储5次完整数组的内容,这显然不是你想要的。应该每次写入当前遍历的单个元素,或者循环结束后一次性写入整个数组。比如写入单个元素的代码:

fwrite(&c[i], sizeof(livro), 1, f);

修正后的完整代码

把所有问题修复后,完整代码如下:

#include <stdio.h>
#include <string.h>

typedef struct objeto livro;
struct objeto { 
    char titulo[100], autor[100]; 
    int cota; 
};

int main() { 
    FILE *f; 
    int tam=5, i=0; 
    livro c[5]; 
    char a[] = "a"; // 修正初始化
    
    f = fopen("bib.dat", "wb"); // 修正赋值
    if(f == NULL) { 
        printf("erro ao abrir ficheiro");
        return 1; // 出错后直接退出,避免后续非法操作
    } 
    
    for(i=0; i<tam; i++) { 
        strcpy(c[i].titulo, a); // 用strcpy完成数组赋值
        strcpy(c[i].autor, a);
        c[i].cota = i;
        fwrite(&c[i], sizeof(livro), 1, f); // 写入当前元素
    } 

    fclose(f); // 操作完成后务必关闭文件
    return 0; 
}

额外提醒

  • 若要更安全地避免缓冲区溢出,推荐使用strncpy,示例:strncpy(c[i].titulo, a, sizeof(c[i].titulo)-1); c[i].titulo[sizeof(c[i].titulo)-1] = '\0';
  • 文件操作完成后一定要调用fclose(f),否则可能导致数据未完全写入磁盘。

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

火山引擎 最新活动