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
相关产品推荐
相关产品推荐

