C语言报错‘is_empty’未在此作用域声明的原因及解决方法
C语言编译错误:'is_empty' was not declared in this scope 问题解析
错误原因
C语言是静态编译型语言,函数调用前必须让编译器知晓函数的存在(要么先定义再调用,要么提前声明)。你的代码里pop函数定义在is_empty之前,调用is_empty时编译器还没读取到它的定义,也没有提前声明,因此触发“未在作用域中声明”的错误。
另外还有一个隐藏问题:你在pop里调用is_empty时传的是*s(结构体实例),但is_empty的参数要求是My_stack *s(指针类型),就算补了声明,这个参数类型不匹配的问题也会导致新的编译错误。
解决步骤
1. 提前声明is_empty函数
在所有函数定义之前,或者在pop函数定义之前,添加is_empty的函数声明,让编译器提前知道这个函数的存在:
int is_empty(My_stack * s);
2. 修正pop函数中is_empty的调用参数
把if(is_empty (*s))改成if(is_empty(s)),传递指针类型参数,匹配is_empty的参数要求。
3. 初始化栈的top成员
代码中创建My_stack stack;后未初始化top,栈初始状态下top应该设为-1,否则会出现未知行为。在main函数里添加初始化代码:
stack.top = -1;
4. 修复其他潜在逻辑/安全问题
scanf("%s",ch);未限制输入长度,容易导致缓冲区溢出,改成scanf("%24s",ch);(ch数组长度为25,留一个位置给字符串终止符)- 原代码未检查字符串中
*的数量,需要确保字符串必须且只能包含一个*,否则逻辑会出错(比如无*或多个*) push函数未检查栈是否已满,建议添加判断避免数组越界- 匹配
*后字符时,要提前检查栈是否为空,避免出现“栈空时执行pop”的错误
修正后的完整代码
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { char home[35]; int top; } My_stack; // 提前声明is_empty函数 int is_empty(My_stack * s); void push(My_stack * s, char c) // 入栈操作 { // 检查栈是否已满 if(s->top >= 34) { printf("ERROR: 栈已满 - 程序终止\n"); exit(1); } s->top++; s->home[s->top] = c; } int pop(My_stack * s) // 出栈操作 { if(is_empty(s)) { // 修正参数传递为指针 printf("ERROR: 栈为空,无法出栈 - 程序终止\n"); exit(1); } return (s->home[s->top--]); } int is_empty(My_stack * s) // 判断栈是否为空 { return(s->top < 0 ? 1 : 0); } int main(){ char ch[25]; int i, star_count = 0; My_stack stack; stack.top = -1; // 初始化栈顶指针 printf("请输入字符串:"); scanf("%24s", ch); // 限制输入长度,避免缓冲区溢出 // 检查字符合法性并统计*的数量 i=0; while(ch[i]!='\0') { if(ch[i]!='A' && ch[i]!='B' && ch[i]!='*') { printf("错误字符!!!允许的字符是A、B和*\n"); exit(0); } if(ch[i] == '*') { star_count++; } i++; } // 检查*的数量是否为1 if(star_count != 1) { printf("该字符串无效:必须且只能包含一个*\n"); exit(0); } // 将*前的字符压入栈 i=0; while(ch[i] != '*') { push(&stack, ch[i]); i++; } i++; // 跳过* // 匹配*后的字符与栈中弹出的字符 while(ch[i] != '\0') { if(is_empty(&stack)) { // 提前检查栈是否为空 printf("该字符串无效:*后的字符数量多于*前的\n"); exit(0); } if(ch[i] != pop(&stack)) { printf("该字符串无效\n"); exit(0); } i++; } // 检查栈是否为空(确保*前后字符数量相等) if(!is_empty(&stack)) { printf("该字符串无效:*前的字符数量多于*后的\n"); exit(0); } printf("该字符串有效\n"); return 0; }
测试示例
- 输入
abbccba*abccbba→ 输出该字符串有效 - 输入
aaabbcb*bcbaab→ 输出该字符串无效 - 输入
ABC*CBA→ 输出错误字符!!!允许的字符是A、B和* - 输入
AA*BB→ 输出该字符串无效
内容的提问来源于stack exchange,提问作者onurb
相关产品推荐
相关产品推荐

