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

C语言井字棋开发:多函数传多值与未声明函数调用问题

解决方案

1. 解决“尚未声明”函数的问题

C语言要求函数在被调用前必须存在声明或定义。你可以在代码开头(#include语句之后)添加所有函数的函数原型,让编译器提前知晓函数的参数和返回值类型:

#include <stdio.h>
#include <stdlib.h>

// 函数原型声明
char spielfeld(char symbol[3][3], int counter);
char symbolset(int auswahl[2], char* spieler, char symbol[3][3], int counter);
char umwandlung(char* eingabe, char* spieler, char symbol[3][3], int counter);
char eingabe(int counter, char symbol[3][3]);

2. 解决多值传递与返回的问题

你的代码中return(symbol, counter)是错误写法——C语言函数只能返回单个值。针对你的需求,有两种高效解决方案:

方案A:用指针传递计数器

计数器counter是基本数据类型,默认传参是值拷贝,函数内修改不会影响外部变量。如果要让main函数感知到计数器的变化,需要传递它的指针(地址);而二维数组symbol本身传递的是首地址,函数内修改会直接作用于原数组,无需额外处理。

核心修改示例:

// 将计数器参数改为指针类型
void spielfeld(char symbol[3][3], int* counter){ 
    // ... 原有棋盘打印逻辑 ...
    (*counter)++; // 通过指针修改原计数器的值
    eingabe(*counter, symbol); // 传递当前计数器的数值
}

// main函数调用时传入计数器地址
int main(){
    int counter = 0;
    char symbol[3][3];
    eingabe(counter, symbol);
}

方案B:封装结构体简化传递

你提到尝试过结构体但觉得麻烦,其实可以把counter和symbol封装成一个结构体,通过传递结构体指针,只需传一个参数就能携带所有游戏状态,比分开传递更简洁:

#include <stdio.h>
#include <stdlib.h>

// 定义游戏状态结构体,整合所有需要传递的数据
typedef struct {
    char symbol[3][3];
    int counter;
} GameState;

// 函数原型改为接收结构体指针
void spielfeld(GameState* state);
void symbolset(int auswahl[2], char* spieler, GameState* state);
void umwandlung(char* eingabe, char* spieler, GameState* state);
void eingabe(GameState* state);

// 修改spielfeld函数,通过结构体指针访问数据
void spielfeld(GameState* state){ 
    printf("\n");
    for(int i=0; i<4;i++){
        for(int j =0; j<3;j++){
            printf("+---");
        }
        printf("+\n");
        if(i<3){
            for(int k=0; k<3;k++){
                if(state->symbol[i][k]== 0){
                    state->symbol[i][k]=' '; // 原代码错误地赋值字符串,改为字符' '
                }
                printf("| %c ", state->symbol[i][k]);
            }
            printf("|  ");
        printf("%d\n",i);
        }
    }
    printf("  A   B   C\n");
    state->counter++;
    eingabe(state);
}

// main函数初始化结构体并传递指针
int main(){
    GameState state = {0}; // 初始化所有成员为0
    eingabe(&state);
}

3. 修复代码中的其他明显错误

  • 字符赋值错误:symbol[i][k]=" ";要改为symbol[i][k]=' ';,因为symbol是char类型数组,只能存储单个字符,不能赋值字符串。
  • 输入安全问题:scanf("%s", eingabe)容易导致缓冲区溢出,建议改为scanf("%2s", eingabe)限制读取长度。
  • 返回值冗余:你的函数实际不需要返回值,可将返回类型从char改为void,避免不必要的编译警告。

内容的提问来源于stack exchange,提问作者programmmm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:01:12