2015-09-19 111 views
0

在學校我們使用整數-999來停止scanf並結束用戶放入數組的輸入。如何添加輸入到數組並停止當用戶輸入字符串'停止'?

例如:

while(input != -999) { 
    scanf("%i", &input) 
    userArray[i] = input; 
    i++; 
} 

我正在考慮要求字符串輸入在用戶與輸入轉換爲整數(使用STDLIB atoi),只要輸入不是「停止」。

這是個好主意嗎?有一個更好的方法嗎?

回答

4

作爲字符串讀入並將其轉換爲int實際上是優選的,因爲它避免了與scanf

特殊性相關而是使用fgets,其讀取一行輸入的潛在缺陷。這個函數將新行字符添加到輸入字符串中,因此在做其他事情之前一定要修剪掉它。一旦你這樣做了,你可以使用strcmp來查看該字符串是否等於「stop」,如果不是,則調用atoi,或更好的strtol(它具有更好的錯誤檢查)來獲取數值。

+0

肯定使用'strtol',而不是'atoi'。 +1表示 –

+0

謝謝!我會給它一個 – Anon101

0

在我看來,當你讀取未知數量的輸入時,停止循環的最好方法是(同樣也是Stanley B. Lippman所說的C++ Prime)你應該嘗試使用「無效輸入」 (如果你想使用一點C++)。

您可以使用此sintax:通過鍵入

如果你是在Windows系統中,我們輸入一個文件結束:

while(std::cin >> input) { 
    userArray[i] = input; 
    i++; 
} 
  • 檔案結尾control-z(按住Ctrl鍵並按z)。在UNIX系統中,包括OS X系統,檔案結尾通常是control-d

    • 無效輸入:

    所以每當你鍵入一個浮點數字或任何其他類型的,這是對於你的輸入來說不是一個int,循環將結束。

    PS:這適用於C++,所以我真的不知道這是否會正常工作的下

+1

在C中沒有'std :: cin'這樣的東西,它所依賴的所有東西都是缺乏的:類,操作符重載,引用 –

+0

@BenVoigt是的,這是真的,所以我認爲這答案會更多地關於C++,在這種情況下不是很有幫助。 –

0

如何停止循環當輸入爲「停止」:

你將使用string.h庫。

do{ 
    scanf("%s", input) 
    userArray[i] = input; 
    i++; 
} while(strcmp(input, "stop") != 0); 

STRCMP陣列input字符串「停止」進行比較,只要輸入不是「停止」,將繼續保持運行。

按照dbush的建議,使用fgets,會好很多。

+0

用更好的語法編輯後,可能更好的解釋。順便說一句,這是假設輸入是一個'char'數組。 –

+2

我懷疑這會工作,因爲它應該。如果我在控制檯輸入「stop」,它會首先將值存儲到數組中,然後在下一次迭代中while循環不會執行。 –

+1

應該是'scanf(「%s」,輸入);'因爲數組已經衰減到一個指針,'userarray [i] = input;'試圖分配不兼容的類型:需要某種解析。 –

0

另一種解決方案,我喜歡用: -

while(true) 
{ 
scanf("%s", input); 
if(!strcmp(input, "stop")) 
    break; 
userarray[i]= input; 
i++; 
} 
+0

不應該是'if(strcmp(input,「stop」)== 0)'? – owacoder

+0

編號'if(strcmp(input,「stop」))'表示strcmp()比較返回的結果是否爲true,然後執行某些操作,在我的情況下,它將從while循環中斷開。 –

+0

您發佈的條件意味着返回的結果是否爲假,然後從循環中斷開,這意味着用戶提供的輸入是「停止」以外的其他內容。 –