You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 01:50:25