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
相关产品推荐
相关产品推荐

