gpt4 book ai didi

c - 为什么 bool isFull 不更新为 false?

转载 作者:行者123 更新时间:2023-11-30 19:01:03 25 4
gpt4 key购买 nike

前言:这个问题是针对我在大学的 C 入门类(class)的一个项目。我是 Stack Overflow 的新手,如果格式和细节不充分,我深表歉意。该程序采用 C 语言编写,用于编辑足球运动员列表。我不允许使用结构。效率不分等级。与问题无关的代码没有给出。

该项目列出了用户可以输入以执行特定任务的输入值菜单。该程序具有三个并行数组:names、nums 和 ratings。如果用户在要求选择选项时输入“a”,程序将提示用户输入姓名、 Jersey 号码和等级,分别添加到数组中。

我使用 boolean 值来检查 nums[] 是否有任何等于 -1 的值。如果是这样, bool isFull 将计算为 false。如果没有,程序将输出“The Roster is full.\n”。运行程序时,可以将1个玩家的信息添加到各自的数组中。然而,即使数组有 10 个索引长,当用户选择第二种类型“a”时,程序 isFull 将计算为 true,并且程序将打印错误消息。这是为什么?我该如何解决这个问题?

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

int findPlayer(int whichPlayer, const int jerseyNumbers[], int maxJersyCount);

int main(void) {
int numToAdd;
double ratingToAdd;
char nameToAdd[100];

int playerFound;
char menuOp = 'x';
bool isFull;

int nums[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};
double ratings[10] = {-1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0};
char names[10][100] = {"~", "~", "~", "~", "~", "~", "~", "~", "~", "~"};

while (menuOp != 'q') {

printf("\nMENU\n");
printf("a - Add a new player\n");
printf("u - Update player information\n");
printf("r - Remove a player from the roster\n");
printf("d - Display player information\n");
printf("p - Print the full roster\n");
printf("s - Print \"Star\" players\n");
printf("q - Quit\n");

printf("\nChoose an option: ") ;
scanf(" %c", &menuOp);

switch (menuOp) {
case 'a':
printf("Enter player jersey number: ");
scanf("%d", &numToAdd);

playerFound = findPlayer(numToAdd, nums, 10);

if (playerFound != -1) {
printf("Jersey # already in use.\n");
break;
}

printf("Enter player first or nick name: ");
scanf("%s", nameToAdd);

printf("Enter player rating: ");
scanf("%lf", &ratingToAdd);

isFull = true;
for (int i = 0; i < 10; i++) {
if (nums[i] == -1) {
isFull = false;
break;
}
}

if (isFull) {
printf("The Roster is full.\n");
}
else {
for (int i = 0; i < 10; i++) {
if (nums[i] == -1) {
for (int j = 0; j < strlen(nameToAdd); j++) {
names[i][j] = nameToAdd[j];
}

nums[i] = numToAdd;
ratings[i] = ratingToAdd;
}
}
}

break;
}

return 0;
}

int findPlayer(int whichPlayer, const int jerseyNumbers[], int maxJersyCount) {
for (int i = 0; i < maxJersyCount; i++) {
if (jerseyNumbers[i] == whichPlayer) {
return i;
}
}

return -1;
}

Program Output

最佳答案

int nums[10] = {-1};

这只将数组的第一个元素初始化为-1,而不是全部。您需要将所有值显式初始化为 -1:

int nums[10] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1};

此外,请确保您的编译器已设置为高警告级别。在外循环中,您在为变量 menuOp 赋值之前读取该变量,这是未定义的行为。

检查 scanf() 的返回值始终是一个好主意,以确保该值已成功读取。它将返回已成功扫描的项目数。在您的情况下,如果成功,每次调用都应返回 1(因为在每种情况下您只扫描一项)。如果返回0,则表示无法按照您请求的格式解析输入,返回负值表示读取输入时出现问题。

查看代码后,似乎您的一个循环尝试在名册中查找空槽以填充那里的数据,但是,一旦填充了名册中的该条目,该循环就不会停止,而是继续用相同的数据填充每个条目。要解决这个问题,您需要在将数据填充到名册中后跳出循环。

for (int i = 0; i < 10; i++) {
if (nums[i] == -1) {
for (int j = 0; j < strlen(nameToAdd); j++) {
names[i][j] = nameToAdd[j];
}

nums[i] = numToAdd;
ratings[i] = ratingToAdd;
break; // need to exit here!
}
}

关于c - 为什么 bool isFull 不更新为 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com