程序在解析后不会结束"退出"

时间:2014-11-21 12:33:56

标签: c

我是C的新手,我正在努力学习,所以对我很轻松:D

我目前正在尝试制作一个简单的银行帐户控制台应用程序。我得到了以下代码:

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

void parseCommand(char cmd[15], bool end) {
    if(cmd != NULL) {
        if(strstr(cmd, "listaccounts") != NULL) {

        } else if(strstr(cmd, "addaccount") != NULL) {

        } else if(strstr(cmd, "removeaccount") != NULL) {

        } else if(strstr(cmd, "withdraw") != NULL) {

        } else if(strstr(cmd, "deposit") != NULL) {

        } else if (strstr(cmd, "exit") != NULL) {
            end = true;
        } else {
            printf("Unknown Command: %s\n", cmd);
        }
    } else {
        printf("cmd is null");
    }
}

int main() {
    printf("Welcome to the Account Management System\n");
    printf("Please use one of the following commands:\n");
    bool end = false;
    while(true) {
        printf("\tlistaccounts\n");
        printf("\taddaccount\n");
        printf("\tremoveaccount\n");
        printf("\twithdraw\n");
        printf("\tdeposit\n");
        printf("\texit\n");
        char cmd[15];
        fgets(cmd,15,stdin);
        parseCommand(cmd, end);
        if(end == true) {
            printf("Shutting down...");
            break;
        }
    }

    return 0;
}

但是当我输入&#34;退出&#34;程序刚刚在while循环中重新开始,并要求输入新的输入。我究竟做错了什么?我的猜测是我尝试比较两个字符串。

5 个答案:

答案 0 :(得分:3)

在C中,变量按值传递。因此,无论您的parseCommand方法中有什么值end,外部函数都不会看到它。一种简单的解决方法是让您的函数返回end

bool parseCommand(char cmd[15], bool end) {
///
  return end;
}


// in main:

end = parseCommand(cmd, end);

答案 1 :(得分:2)

您正在尝试修改在函数外声明的变量的值。你需要一个指向它的指针。

答案 2 :(得分:2)

要编译,首先添加#include <stdbool.h>


在您的代码中,您使用pass-by-value传递end。这将在end范围内创建parseCommand()的本地副本。无论使用end代码中的parseCommand()值执行什么操作,都不会反映到main()

  1. parseCommand(cmd, end);更改为parseCommand(cmd, &end);
  2. void parseCommand(char cmd[15], bool end)更改为void parseCommand(char cmd[15], bool *end)
  3. end = true;更改为*end = true;
  4. 此外,if(cmd != NULL)应更改为if ((cmd != NULL) && (end != NULL))

答案 3 :(得分:2)

如果你想让'parseCommand'从main函数改变变量,你应该传递一个指针。

void parseCommand(char cmd[15], bool * end) {
if(cmd != NULL) {
    if(strstr(cmd, "listaccounts") != NULL) {

    } else if(strstr(cmd, "addaccount") != NULL) {

    } else if(strstr(cmd, "removeaccount") != NULL) {

    } else if(strstr(cmd, "withdraw") != NULL) {

    } else if(strstr(cmd, "deposit") != NULL) {

    } else if (strstr(cmd, "exit") != NULL) {
        *end = true;
    } else {
        printf("Unknown Command: %s\n", cmd);
    }
} else {
    printf("cmd is null");
}
}

int main() {
    printf("Welcome to the Account Management System\n");
    printf("Please use one of the following commands:\n");
    bool end = false;
    while(true) {
        printf("\tlistaccounts\n");
        printf("\taddaccount\n");
        printf("\tremoveaccount\n");
        printf("\twithdraw\n");
        printf("\tdeposit\n");
        printf("\texit\n");
        char cmd[15];
        fgets(cmd,15,stdin);
        parseCommand(cmd, &end);
        if(end == true) {
            printf("Shutting down...");
            break;
        }
    }

    return 0;
}

答案 4 :(得分:1)

当您传递说void parseCommand(char cmd[15], bool end)时,您正在创建函数范围内的重复变量(您可能希望查找范围)。因此bool end成为函数的复制本地,当函数完成时,无法再次访问它。您可以使用指针并将bool end设为bool *end,或者您可以让该函数返回bool,说bool parseCommand(char cmd[15], bool end)