C语言循环迭代中静态创建Player实例及相关问题排查
问题解决方案
1. 循环中静态创建Player实例的合理性
你在循环里声明Player New_Player;是完全可行的:
- 这个变量是栈上的局部变量,每次循环迭代时会重新分配内存,循环结束后自动销毁。
- 但你已经通过
Record_Of_Payers[Players_active - 1] = New_Player;把它的内容拷贝到了静态数组中,所以即使New_Player销毁,数组里的内容依然保留,完全符合你“避免动态内存”的需求。 - 这部分逻辑无需修改,当前写法是合理的。
2. 输入'7'无法立即终止循环的问题
问题出在scanf("%s\n", Name);的格式字符串里的\n:
scanf的格式字符串中,\n会匹配任意数量的空白字符(包括换行、空格、制表符),所以当你输入7并按下回车后,scanf会继续等待,直到读取到非空白字符才会返回,导致需要额外输入字符才能触发判断。- 修正方法:去掉格式字符串里的
\n,改成:
这样输入scanf("%s", Name);7并回车后,scanf会立即读取"7"到Name数组中,进入else分支终止循环。
3. 代码中的拼写错误
你调用初始化函数时写了Register_PLayer_Finalisation,但函数实际名字是Register_Player_Finalisation(P和L的大小写颠倒了),这个拼写错误会导致编译失败,需要修正为正确的函数名。
4. 未定义变量问题
原代码中Record[0] = Player_created;和Record[Players_active - 1] = New_Player;里的Record是未定义的,应该替换为函数参数Record_Of_Payers,否则会触发编译错误。
修正后的完整代码片段
int Register_Player(Player *Record_Of_Payers) { int Players_active = 1; char Name[20]; scanf("%s", Name); // 去掉格式串中的\n char Role[20] = "Not_Yet"; char State[8] = "Not_Yet"; int Money = 2000; Player Player_created; Register_Player_Finalisation(Name, Money, Role, State, &Player_created); // 修正函数名拼写 Record_Of_Payers[0] = Player_created; // 替换为正确的数组名 /* Boucle pour ajouter des joueurs */ while (Players_active < 6 ) { scanf("%s", Name); // 去掉格式串中的\n if (*Name != '7') { Players_active++; Player New_Player; Register_Player_Finalisation(Name, Money, Role, State, &New_Player); // 修正函数名拼写 Record_Of_Payers[Players_active - 1] = New_Player; // 替换为正确的数组名 } else { printf("Exception \n"); break; } } return Players_active; }
额外优化(可选)
如果需要支持带空格的玩家名字,%s无法满足,此时可以改用fgets读取输入并处理换行符:
fgets(Name, sizeof(Name), stdin); // 去掉fgets读取到的换行符 size_t len = strlen(Name); if (len > 0 && Name[len-1] == '\n') { Name[len-1] = '\0'; }
内容的提问来源于stack exchange,提问作者th_o_mas
相关产品推荐
相关产品推荐

