在學校我們使用整數-999來停止scanf
並結束用戶放入數組的輸入。如何添加輸入到數組並停止當用戶輸入字符串'停止'?
例如:
while(input != -999) {
scanf("%i", &input)
userArray[i] = input;
i++;
}
我正在考慮要求字符串輸入在用戶與輸入轉換爲整數(使用STDLIB atoi
),只要輸入不是「停止」。
這是個好主意嗎?有一個更好的方法嗎?
在學校我們使用整數-999來停止scanf
並結束用戶放入數組的輸入。如何添加輸入到數組並停止當用戶輸入字符串'停止'?
例如:
while(input != -999) {
scanf("%i", &input)
userArray[i] = input;
i++;
}
我正在考慮要求字符串輸入在用戶與輸入轉換爲整數(使用STDLIB atoi
),只要輸入不是「停止」。
這是個好主意嗎?有一個更好的方法嗎?
作爲字符串讀入並將其轉換爲int
實際上是優選的,因爲它避免了與scanf
特殊性相關而是使用fgets
,其讀取一行輸入的潛在缺陷。這個函數將新行字符添加到輸入字符串中,因此在做其他事情之前一定要修剪掉它。一旦你這樣做了,你可以使用strcmp
來查看該字符串是否等於「stop」,如果不是,則調用atoi
,或更好的strtol
(它具有更好的錯誤檢查)來獲取數值。
在我看來,當你讀取未知數量的輸入時,停止循環的最好方法是(同樣也是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++,所以我真的不知道這是否會正常工作的下
在C中沒有'std :: cin'這樣的東西,它所依賴的所有東西都是缺乏的:類,操作符重載,引用 –
@BenVoigt是的,這是真的,所以我認爲這答案會更多地關於C++,在這種情況下不是很有幫助。 –
如何停止循環當輸入爲「停止」:
你將使用string.h
庫。
do{
scanf("%s", input)
userArray[i] = input;
i++;
} while(strcmp(input, "stop") != 0);
STRCMP陣列input
字符串「停止」進行比較,只要輸入不是「停止」,將繼續保持運行。
按照dbush的建議,使用fgets,會好很多。
用更好的語法編輯後,可能更好的解釋。順便說一句,這是假設輸入是一個'char'數組。 –
我懷疑這會工作,因爲它應該。如果我在控制檯輸入「stop」,它會首先將值存儲到數組中,然後在下一次迭代中while循環不會執行。 –
應該是'scanf(「%s」,輸入);'因爲數組已經衰減到一個指針,'userarray [i] = input;'試圖分配不兼容的類型:需要某種解析。 –
另一種解決方案,我喜歡用: -
while(true)
{
scanf("%s", input);
if(!strcmp(input, "stop"))
break;
userarray[i]= input;
i++;
}
不應該是'if(strcmp(input,「stop」)== 0)'? – owacoder
編號'if(strcmp(input,「stop」))'表示strcmp()比較返回的結果是否爲true,然後執行某些操作,在我的情況下,它將從while循環中斷開。 –
您發佈的條件意味着返回的結果是否爲假,然後從循環中斷開,這意味着用戶提供的輸入是「停止」以外的其他內容。 –
肯定使用'strtol',而不是'atoi'。 +1表示 –
謝謝!我會給它一個 – Anon101