差異

2016-11-19 46 views
0
while(scanf("%s",a)) 
{ 

    if(a[0]=='#') 
    break; 
    nextpermutation(a); 
} 

這個while循環非常適用於scanf函數(」 %S「) ,但如果我把scanf函數( 「%[^ \ n] s」,a)在它剛剛運行一次的時候 我檢查了兩個scanf的返回值,它們仍然是相同的 我沒有明白爲什麼會發生這種情況......差異

+2

你知道scanf'的'的邪惡,您應該使用'標準:: cin'呢? –

+1

'%s'丟棄前導空白,'%[set]'不會。在第一次通話時,您會讀到,但不包括保留在流中的'\ n'字符。在第二次調用時,'%[^ \ n]'不能檢索任何字符,因爲第一個字符是'\ n'。 –

+0

嘗試'「%99 [^ \ n]」 - 注意字符串開頭的空格(忽略空格)和99個字符的限制(不要溢出緩衝區)。 –

回答

1

什麼是s%[^\n]s

在那裏做你scanf("%[^\n]s")包含格式字符串中的格式說明符:%[^\n]後跟一個單獨的s。這將要求輸入流在%[^\n]匹配的序列之後包含s。當然,這在行爲上並不是非常接近%s。僅憑這個原因,匹配這些格式的序列將會非常不同。

注意[]不是%s格式的修改,你似乎錯誤地認爲。 []scanf是一個自給自足的格式說明符。你的意思是隻是%[^\n]而不是%[^\n]s

1

2個失敗者的戰鬥:"%s""%[^\n]s"

兩個說明符和不屬於是健壯的代碼。既不限制用戶輸入,也可以輕鬆超出目標緩衝區。

"%[^\n]s"沒有任何用處。 @Jonathan Leffler。所以"%[^\n]"被審查以下 - 仍然是不好的。

"%s"消耗領先的空白。 "%[^\n]"@Igor Tandetnik

"%[^\n]"讀取什麼如果主角是一個'\n',留下a不變,或很少處於未知狀態。

"%[^\n]"讀取除'\n'之外的所有字符。

"%s"讀取所有前導空格,丟棄它們,然後讀取並保存所有非空格。


最好使用fgets()讀取用戶輸入,然後解析它。

例:讀取輸入行,包括空格:

char a[100]; 
if (fgets(a, sizeof a, stdin) == NULL) Handle_EOF_or_Error(); 

// if the potential trailing \n is not wanted 
a[strcspn(a, "\n")] = '\0';