前言:这个问题是针对我大学的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;
}


c - 为什么不将isFull更新为false?-LMLPHP

最佳答案

int nums[10] = {-1};


这只会将数组的第一个元素初始化为-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 - 为什么不将isFull更新为false?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58550044/

10-14 19:19