向嵌套结构体赋值时出现编译错误:expected expression before 'game'
解决结构体赋值时的"expected expression before 'game'"编译错误
你遇到的这个编译错误,核心原因很简单:game是你通过typedef定义的结构体类型名,不是实际的变量。C语言里,你必须先声明一个该类型的变量,才能用点.运算符去访问它的成员。
第一步:声明结构体变量
在使用结构体成员之前,先创建一个game类型的变量,比如:
game myGame; // 这里myGame是变量名,你可以换成任何合法的标识符
第二步:修正成员访问代码
把原来的game.title这类写法,换成变量名加成员,比如:
// 注意:不推荐用gets,后面会说原因 gets(myGame.title); gets(myGame.platform); gets(myGame.developer); scanf("%d", &myGame.year);
重要提醒:替换不安全的gets()
gets()函数已经被C标准废弃了,因为它不会检查输入的长度,很容易导致缓冲区溢出,引发程序崩溃或者安全问题。建议用fgets()替代,不过要注意fgets()会把输入的换行符\n也读进去,需要手动去掉:
比如读取title的代码可以改成:
fgets(myGame.title, MAX, stdin); // 去掉换行符 myGame.title[strcspn(myGame.title, "\n")] = '\0';
处理scanf()后的换行符残留
当你用scanf("%d", &myGame.year)读取年份后,输入缓冲区里会留下一个换行符,如果后面继续用fgets()读取字符串,会直接读到这个空行。解决方法是在scanf()之后,用getchar()把换行符吃掉:
scanf("%d", &myGame.year); getchar(); // 清除缓冲区里的换行符
完整的修正示例代码
#include <stdio.h> #include <string.h> #include <stdbool.h> #define MAX 100 typedef struct gameInfo { char title[MAX]; char platform[MAX]; char developer[MAX]; unsigned int year; struct borrowerInfo { bool borrowed; char nameOfBorrower[MAX]; char date[MAX]; } borrower; } game; int main() { // 声明结构体变量 game myGame; printf("输入游戏标题:"); fgets(myGame.title, MAX, stdin); myGame.title[strcspn(myGame.title, "\n")] = '\0'; printf("输入平台:"); fgets(myGame.platform, MAX, stdin); myGame.platform[strcspn(myGame.platform, "\n")] = '\0'; printf("输入开发商:"); fgets(myGame.developer, MAX, stdin); myGame.developer[strcspn(myGame.developer, "\n")] = '\0'; printf("发行年份:"); scanf("%d", &myGame.year); getchar(); // 清除换行符,避免影响后续输入(如果有的话) // 测试输出 printf("\n游戏信息:\n"); printf("标题:%s\n", myGame.title); printf("平台:%s\n", myGame.platform); printf("开发商:%s\n", myGame.developer); printf("年份:%u\n", myGame.year); return 0; }
这样修改后,编译错误就会消失,同时代码也更安全可靠。
内容的提问来源于stack exchange,提问作者erykkk
相关产品推荐
相关产品推荐

