如何修复C语言中‘无类型参数列表仅允许在函数定义中使用’的编译错误
修复Vote函数的编译错误与逻辑问题
首先,先拆解你遇到的编译错误:
a parameter list without types is only allowed in a function definition
int strcmp(cn, name);
^
这个错误是因为你在vote函数里写了int strcmp(cn, name);——这行代码看起来像是在声明一个新的strcmp函数,但你没有给参数指定类型(比如正确的声明应该是int strcmp(const char *a, const char *b);)。而实际上,strcmp是C标准库<string.h>里的内置函数,你不需要重新声明它,直接调用即可。
除此之外,你的vote函数还有几个逻辑问题,我来一步步帮你修正:
原代码的问题梳理
- 未初始化的变量
i:你在int i;之后直接写string cn = candidates[i].name;,此时i是未赋值的垃圾值,会导致访问非法内存。 - 循环起始下标错误:数组下标是从0开始的,你的循环从
i=1开始,会跳过第一个候选人(candidates[0])。 - 错误的strcmp使用方式:你没有保存strcmp的返回值,也没有用它做判断,反而试图“声明”这个函数。
- 返回值逻辑错误:你直接返回
strcmp(函数名本身),这不是合法的bool值,完全不符合投票验证的逻辑。
修复后的完整代码
首先,确保你已经包含了<string.h>和<stdbool.h>头文件(strcmp和bool类型分别依赖它们):
#include <string.h> #include <stdbool.h> // 你的全局结构体定义、MAX宏定义等代码...
然后,修正后的vote函数如下:
bool vote(string name) { // 遍历所有候选人(数组下标从0开始) for (int i = 0; i < MAX; i++) { // strcmp返回0表示两个字符串完全相等 if (strcmp(candidates[i].name, name) == 0) { // 找到匹配的候选人,票数+1 candidates[i].votes++; // 验证成功,返回true return true; } } // 遍历完所有候选人都没找到匹配,返回false return false; }
代码功能说明
- 循环从
i=0开始,覆盖数组里的所有候选人(下标0到MAX-1),不会遗漏任何一个。 - 每次循环调用
strcmp比较输入名字和当前候选人的名字,返回0时说明两者完全一致。 - 找到匹配项后,立刻给该候选人的票数加1,并返回
true(表示投票有效)。 - 如果循环结束都没找到匹配,返回
false(表示投票无效)。
这样既修复了编译错误,也让函数实现了正确的投票验证功能~
内容的提问来源于stack exchange,提问作者Sizwe
相关产品推荐
相关产品推荐

