2016-02-28 88 views
1

我正在創建一個c殼,並有一個問題,我卡在一個無限循環。示例輸入/輸出:我輸入「ls -a」,命令的結果不斷地反覆打印到控制檯。如果我刪除標籤(我稱爲start:)和goto語句,那麼我的shell將執行該命令,然後完全退出shell程序。我也嘗試使用while(1)和for(;;)循環,但這些結果與我目前得到的輸出相同。我怎樣才能在這裏完成我的目標?所有的幫助表示讚賞。看下面的代碼。c殼卡在無限循環

int main(int argc, const char* argv[]){ 
    char whole[1024]; 
    int cmdCount = 1; 

start: 
    scanf("%1023[^\t\n]", whole); 
    //.... 
goto start; 

return 0; 
} 
+0

仔細檢查你的第一個while循環。 – Annabelle

+5

'if(third =「」)' - 同時出現兩個錯誤:(1)您無條件地將一個空字符串分配給'third'。由於空字符串不是「NULL」,所以共同作廢是錯誤的。 (2)你不能比較字符串和常規比較,'=='。要測試一個字符串是否爲空,請執行'if(* third =='\ 0')'。 –

+0

@M Oehm這運行良好,並沒有錯誤。我正在檢查它是否爲空,如果它爲空,則設置爲空 – GregH

回答

3

您的scanf將讀取除換行符或製表符以外的所有內容。你從不檢查它是否讀取任何內容。所以第一次成功時,下一次有新行,所以它不能讀取任何東西。你不檢查這個,只是使用包含以前讀取的行的緩衝區。這將導致相同的命令一遍又一遍地運行。

寧可從stdin讀取行並解析它們,請勿用scanf閱讀。

+0

你有建議如何解決這個問題嗎? – GregH

+0

@peggy正如我寫的,一次讀取輸入行。 fgets是你的朋友。如果你想使用scanf,總是檢查返回值。 –

0

問題是你沒有檢查你的scanf函數的返回值。首先它掃描一切到\n字符並執行你的代碼。但\n字符仍然保留在緩衝區中;所以下一個scanf將不會做任何事情,從而保持原有的價值不變。這就是爲什麼它一遍又一遍地執行相同的命令。請檢查以下代碼:

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

int main(void) { 
    char whole[1024]; 
    strcpy(whole, "override whole string"); 
    scanf("%1023[^\t\n]", whole); 
    printf("%s\n", whole); 
    strcpy(whole, "override whole string"); 
    scanf("%1023[^\t\n]", whole); 
    printf("%s\n", whole); 

    return 0; 
} 

它不允許您輸入兩行。第二scanf只會失敗,留下舊的「重寫」價值。使用fgets函數獲取整行輸入。