簡體   English   中英

程序在解析“退出”后沒有結束

[英]Program doesn't end after parsing “exit”

我是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;
}

但是,當我鍵入“ exit”時,程序只是在while循環中重新開始,並要求新的輸入。 我究竟做錯了什么? 我的猜測將是我如何嘗試比較兩個字符串。

在C語言中,變量按值傳遞。 因此,無論parseCommand方法中的end值如何,外部函數都不會看到它。 一種簡單的解決方法是使函數返回end

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


// in main:

end = parseCommand(cmd, end);

您正在嘗試修改在函數外部聲明的變量的值。 您需要一個指向它的指針。

要進行編譯,請首先添加#include <stdbool.h>


在您的代碼中,您使用傳遞值傳遞end 這將在parseCommand()范圍內創建end的本地副本。 parseCommand()代碼中使用end值完成的任何操作都不會反映到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;

同樣, if(cmd != NULL)應該更改為if ((cmd != NULL) && (end != NULL))

如果要“ parseCommand”從主函數更改變量,則應傳遞它的指針。

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;
}

當您說出void parseCommand(char cmd[15], bool end) ,您正在創建函數范圍局部的重復變量(您可能要查找范圍)。 因此, bool end成為該函數的本地副本,並且當函數完成時,無法再次訪問它。 您可以使用指針並將bool endbool *end ,或者可以通過說bool parseCommand(char cmd[15], bool end)使函數返回bool

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM