[英]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()
。
parseCommand(cmd, end);
parseCommand(cmd, &end);
void parseCommand(char cmd[15], bool end)
更改為void parseCommand(char cmd[15], bool *end)
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 end
為bool *end
,或者可以通過說bool parseCommand(char cmd[15], bool end)
使函數返回bool
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.