为什么不将isFull更新为false?

时间:2019-10-24 22:41:36

标签: c boolean

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

此项目列出了用户可以输入以执行特定任务的输入值菜单。该程序具有三个并行数组:名称,数字和等级。如果要求用户选择一个选项时键入“ a”, 该程序将提示用户输入名称,球衣号码和等级以分别添加到阵列中。

我正在使用布尔值检查nums []是否具有等于-1的任何值。如果是这样,则bool isFull将评​​估为false。否则,程序将输出“名册已满。\ 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

1 个答案:

答案 0 :(得分:1)

int nums[10] = {-1};

这只会将数组的 first 元素初始化为-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!
    }
}