C语言main.c:14:10编译报错:‘=’前预期: , ; }或__attribute__
报错产生原因
C语言语法规则不允许在定义结构体类型时直接给内部成员赋默认初始值,你在结构体里写的int code = -1;是C++支持的类成员默认初始化写法,不属于标准C的合法语法,因此编译器在=符号位置抛出语法错误,提示此处期望结构体定义合法的分隔标记。
你删除=-1后能通过编译,只是因为此时结构体定义符合C语法要求,但你原本希望所有事件条目的code成员默认值为-1、用于标记条目未被使用的需求没有实现,自然无法达到预期功能。
正确修复方案
- 先修改结构体定义,删除成员后直接写的初始化赋值,结构体本身只做成员类型定义:
struct event { int code; char name[50]; int count; char gender; };
- 实现全局event数组的默认初始化,把所有元素的code成员默认设为-1,两种写法二选一即可:
- GCC等常用编译器支持C的范围初始化语法,可以在定义数组时直接批量赋值:
struct event event[100] = {[0 ... 99] = {.code = -1}};- 如果要兼容所有C编译器,可以在main函数最开头加循环遍历初始化:
int main() { int i; // 初始化所有事件条目的code为-1,标记未使用 for(i = 0; i < 100; i++){ event[i].code = -1; } // 后续原有代码保持不变 int eventnum = -1; char choice; // ...
代码中其他影响功能的问题
你当前代码还有几处逻辑错误,即使修复了初始化问题也无法正常运行,需要一并修正:
- 三个校验函数
check/checkcount/checkgender缺少校验通过的返回值,校验符合要求时要加return 1;,否则函数会返回随机的栈垃圾值,导致if(!check(...))的判断完全失效。其中checkgender的判断条件写反,正确判断逻辑是当输入既不是M、也不是F、也不是X时才报错,即if (gender != 'M' && gender != 'F' && gender != 'X')。 - 查询(case 's')、更新(case 'u')事件的遍历循环没有加边界判断,找不到对应code时会一直向后遍历数组,造成越界访问内存,直接导致程序崩溃。遍历时要加上
i <= eventnum的边界限制,循环结束后如果i超过eventnum就说明条目不存在。 fflush(stdin)属于标准未定义行为,C标准只规定fflush用于刷新输出流,用它清空输入缓冲区在不同编译器下表现不一致,很容易出现输入读取异常。- 更新事件(case 'u')读取事件名称时下标写错,你写的是
event[eventnum + 1].name,应该改为event[i].name,否则新输入的名称会写入错误的数组位置,覆盖已有数据。
内容的提问来源于stack exchange,提问作者Aman Velpula
相关产品推荐
相关产品推荐

