2012-02-16 67 views
2

所以我必須讓scanf讀取由空格分隔的幾個字符串。然而,事先並不知道需要讀取多少個字符串,它可以是1到5之間的任意值,但我似乎無法讓scanf在輸入輸入後停止嘗試讀取。我曾嘗試過這樣天真的%s %s %s %s %s,但正如你可以想象的,在打了一個或兩個單詞之後按下回車鍵之後,它仍然希望閱讀更多內容,然後我也嘗試去做%s%*[^\n]%s%*[^\n]%s%*[\n]%s%*[\n]%s%*[^\n],這樣它會在換行符後嘗試停止,但是那也沒用。scanf可選匹配

那麼讓scanf能夠擁有一些可選輸入部分的最佳方法是什麼?

謝謝。

編輯:我知道的strtok並與fgets我只是想看看是否有一種方式與scanf函數

回答

4

做到這一點如何使用fgets讀一行,然後strotk/sscanf解析呢?然後,您將能夠確定用戶輸入了多少個字符串。

+0

好這就是我可能要做的事情,我只是想知道是否有辦法像這樣做。 – csteifel 2012-02-16 19:26:56

+1

@legion那麼*可能*是一種方式,但使用'scanf'本質上是不可靠的。你對用戶輸入的內容沒有太多的控制。另一方面,當你使用'fgets'時,你將所有的字符串放在一個緩衝區中,你可以完全自由地解析它,因爲你看不到'scanf'。 – cnicutar 2012-02-16 19:28:36

3

scanf不強制讀取整個格式字符串,一旦它得到無效輸入或沒有輸入剩餘,就會中止。

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

成功時,該函數返回項目的成功次數 讀。如果發生匹配故障,此計數可以匹配預期的讀數數量或更少,即使爲零也不會超過 。

下面的代碼告訴你有多少爭論中scanf宣讀:

char s1[10], s2[11], s3[11], s4[11], s5[11]; 
int read = scanf("%10s %10s %10s %10s %10s", s1, s2, s3, s4, s5); 
printf("Read %d strings", read); 

如果輸入aaa bbb ccc並回車,它打印3,爲aaa bbb ccc ddd它打印4等