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

C语言给结构体数组元素赋值遇语法错误,求解决

问题解决:结构体数组指针访问的语法错误修正

错误原因

你写的pbk->(status+i)不符合C语言语法规则,->运算符右侧必须直接跟结构体成员名称,不能用括号包裹表达式。要通过指针算术访问数组元素,需先获取数组的首地址(pbk->status),再做指针偏移,最后用->访问成员。

修正后的代码

#include <stdio.h>
#include <string.h> // 用于memset函数

typedef struct info_student {
    char    status_char;
    char    student_code[7];
    int     day_get;
    int     month_get;
    int     day_dev;
    int     month_dev;
} InfoStudent;

typedef struct book {
    int         book_code;
    char        title[80];
    char        author[80];
    InfoStudent status[2];
} Book;

void create_book(Book *pbk) {
    pbk->book_code = 1;
    printf("Type the title:");
    // 替换不安全的gets,用fgets读取输入
    fgets(pbk->title, sizeof(pbk->title), stdin);
    // 移除fgets读取到的换行符
    pbk->title[strcspn(pbk->title, "\n")] = '\0';
    
    printf("Type the author:");
    fgets(pbk->author, sizeof(pbk->author), stdin);
    pbk->author[strcspn(pbk->author, "\n")] = '\0';
    
    int i;
    for (i = 0; i < 2; i++) {
        // 正确的指针算术访问方式
        (pbk->status + i)->day_get = -1;
        (pbk->status + i)->day_dev = -1;
        (pbk->status + i)->month_get = -1;
        (pbk->status + i)->month_dev = -1;
        // 用memset清空字符数组,不能直接赋值空字符
        memset((pbk->status + i)->student_code, '\0', sizeof((pbk->status + i)->student_code));
        (pbk->status + i)->status_char = 'F';
    }
}

关键要点说明

  • 指针算术的正确写法:pbk->status是数组status的首地址,pbk->status + i指向数组的第i个元素(等价于&pbk->status[i]),用括号包裹后再用->访问成员即可避免语法错误。
  • 替换不安全的gets:gets存在缓冲区溢出风险,推荐用fgets替代,同时用strcspn去掉读取到的换行符,避免输入内容末尾残留换行。
  • 字符数组赋值规则:不能直接给字符数组student_code赋值'',需用memset函数清空数组,或逐个元素赋值为'\0'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:45:37