2014-11-21 47 views
0

我新的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循環,並要求新的輸入。我究竟做錯了什麼?我的猜測是我如何嘗試比較兩個字符串。

+1

下手,你忘了,包括「stdbool.h」 – 2014-11-21 12:36:10

+1

你從來沒有真正結束設置。你把它傳遞給一個函數,把它不改變它的值,除非它是一個指針。我建議將函數從void更改爲布爾值,然後在返回時檢查該值。 – Hashman 2014-11-21 12:36:38

回答

2

主要樂趣的變量ction,你應該傳遞它的指針。

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

這是我第一次使用指針。但考慮到這個問題的所有其他答案,我現在看到我爲什麼必須這樣做。謝謝你指出! – OmniOwl 2014-11-21 12:43:20

2

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

3

在C中,變量是按值傳遞的。所以無論你的parseCommand方法中有什麼值end,外層函數都不會看到它。一個簡單的方法來解決它是讓你的函數返回end

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


// in main: 

end = parseCommand(cmd, end); 
+0

哦,是的,它的確如此。謝謝,但我改變了它,以便我傳遞一個指向布爾的指針。 – OmniOwl 2014-11-21 12:43:59

2

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


在您的代碼中,您使用傳遞值傳遞end。這將在parseCommand()範圍內創建end的本地副本。不管endparseCommand()內的值如何,代碼都不會反映到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)應該如果你想 'parseCommand' 來改變而改變,以if ((cmd != NULL) && (end != NULL))

+0

@ ANBU.SANKAR對不起,我沒有得到你。 – 2014-11-21 12:40:56

+0

@ ANBU.SANKAR對不起,仍然沒有。請解釋,[就像我是一個白癡] .... – 2014-11-21 12:44:01

+0

爲什麼我需要先導入stdbool.h,當代碼編譯罰款? – OmniOwl 2014-11-21 12:48:43

1

當你通過說void parseCommand(char cmd[15], bool end),要創建函數的局部範圍重複的變量(你可能想查找範圍)。因此bool end成爲該函數的本地重複,並且當該函數結束時,它不能被再次訪問。你可以使用一個指針,使bool endbool *end,或者你可以有函數返回一個bool,說bool parseCommand(char cmd[15], bool end)

+0

我知道範圍是什麼,但我忘了C通過價值:) – OmniOwl 2014-11-21 13:44:06

+0

我打算爲正確的答案投票,但不要求提高票數:P – OmniOwl 2014-11-21 13:51:07