【问题标题】:Why doesn't bool isFull update to false?为什么 bool isFull 不更新为 false?
【发布时间】:2019-10-24 22:41:36
【问题描述】:

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

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

我正在使用布尔值来检查 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;
}

【问题讨论】:

  • 您为 10 个空槽中的每一个设置了相同的数据。成功设置空槽后,在 for 循环中添加一个中断

标签: c boolean


【解决方案1】:
int nums[10] = {-1};

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

【讨论】:

  • 感谢您的建议。我修复了nums[] 的数组初始化,并检查了每个scanf() 的返回值。他们都返回了 1。我还在它的声明中初始化了menuOp。然而,问题并未得到解决。
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 2015-02-04
  • 2013-06-27
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多