while(scanf("%s",a))
{
if(a[0]=='#')
break;
nextpermutation(a);
}
這個while循環非常適用於scanf函數(」 %S「) ,但如果我把scanf函數( 「%[^ \ n] s」,a)在它剛剛運行一次的時候 我檢查了兩個scanf的返回值,它們仍然是相同的 我沒有明白爲什麼會發生這種情況......差異
while(scanf("%s",a))
{
if(a[0]=='#')
break;
nextpermutation(a);
}
這個while循環非常適用於scanf函數(」 %S「) ,但如果我把scanf函數( 「%[^ \ n] s」,a)在它剛剛運行一次的時候 我檢查了兩個scanf的返回值,它們仍然是相同的 我沒有明白爲什麼會發生這種情況......差異
什麼是s
在%[^\n]s
?
在那裏做你scanf("%[^\n]s")
包含格式字符串中的格式說明符:%[^\n]
後跟一個單獨的s
。這將要求輸入流在%[^\n]
匹配的序列之後包含s
。當然,這在行爲上並不是非常接近%s
。僅憑這個原因,匹配這些格式的序列將會非常不同。
注意[]
不是%s
格式的修改,你似乎錯誤地認爲。 []
在scanf
是一個自給自足的格式說明符。你的意思是隻是%[^\n]
而不是%[^\n]s
?
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';
你知道scanf'的'的邪惡,您應該使用'標準:: cin'呢? –
'%s'丟棄前導空白,'%[set]'不會。在第一次通話時,您會讀到,但不包括保留在流中的'\ n'字符。在第二次調用時,'%[^ \ n]'不能檢索任何字符,因爲第一個字符是'\ n'。 –
嘗試'「%99 [^ \ n]」 - 注意字符串開頭的空格(忽略空格)和99個字符的限制(不要溢出緩衝區)。 –