2016-12-28 108 views
1

我試圖創建一個命令行應用程序在C如何在C中創建命令行?

int main(int argc, char const *argv[]) 
{ 
    char cmd[40]; 

    do { 
    scanf("%[^\n]", cmd); 

    if(strcmp(cmd, "start")) 
     new_game(); 
    } while(strcmp(cmd, "exit")); 
    return 0; 
} 

我不能使用「%S」,因爲這樣我需要用例外的命令可能有多個參數並忽略新的行char。問題是程序在一次插入後不再調用scanf。這是爲什麼發生?

謝謝

回答

5

使用fgets代替讀取整個輸入,如下所示:

char cmd[255]; 
fgets(cmd, 255, stdin); 

樣品可以發現here


另外,strcmp功能在您的示例中未正確使用。 Strcmp返回:

  • < 0時不匹配的第一個字符在PTR1比PTR2一個較低的值,
  • 0當它們相等時
  • 「> 0時的第一個字符的是不比賽在PTR1比PTR2

較大的值,所以在你的榜樣,你應該使用strcmp(str1, str2) == 0!strcmp(str1, str2)的簡稱。


注:應謹慎使用fgets時服用。換行符被認爲是有效的fgets,它是包括在字符串中的。另一方面scanf(" %s")換行是不包含在結果字符串中的

+0

在while的條件是正確的。看看我是否進入「退出」,strcmp(cmd,「exit)等於0,那麼程序將退出循環。這就是我想要的。 – g4rrucho

+0

感謝fgets的建議。像一個魅力:)作品 – g4rrucho

+0

@ g4rrucho你非常歡迎,如果它對你有幫助,你可以將asnwer標記爲已接受! – Quest

1

strcmp(cmd, "start")的意思是 「當CMD不等於開始」。你需要!strcmp(cmd, "start")

+0

在開始比較你是對的。但退出一個是正確的 – g4rrucho

+0

感謝您的提示:) – g4rrucho

1

程序卡住,因爲你讀到的一切直到第一個換行符,但隨後你再回去和scanf()找到一個換行,這是不通過掃描組所允許,所以沒有讀取字符和離開換行符在下一次循環中進行。

您應該檢查從scanf()返回的值;如果它爲零,則下一個字符對格式字符串無效。

您必須閱讀換行符。

一種簡單的方法是在格式字符串中設置的%[…]掃描之前包含一個空格。即跳過開頭的空白,包括換行,讀取一條線的信息的其餘部分之前(以及39防止緩衝區溢出):

if (scanf(" %39[^\n]", cmd) == 1) 
    …process the string in cmd… 
else 
    …report error… 

另一種簡單的方法是使用所述scanf()後一個循環:

int c; 
while ((c = getchar()) != EOF && c != '\n') 
    ; 

或者,如其他人所建議的,讀取一行輸入,然後處理該行,或許用sscanf()將信息讀入命令名變量。