2016-01-30 94 views
11

假設我忘記關閉掃描集的右方括號]。那麼會發生什麼?它是否調用未定義的行爲?如果我忘記關閉掃描集會發生什麼情況?

例子:

char str[] = "Hello! One Two Three"; 
char s1[50] = {0}, s2[50] = {0}; 
sscanf(str, "%s %[^h", s1, s2); /* UB? */ 
printf("s1='%s' s2='%s'\n", s1, s2); 

編譯時我從GCC警告:

source_file.c: In function ‘main’: 
source_file.c:11:5: warning: no closing ‘]’ for ‘%[’ format [-Wformat=] 
    sscanf(str, "%s %[^h", s1, s2); /* UB? */ 

和輸出

s1='Hello!' s2='' 

我也注意到,sscanf返回1但是到底發生了什麼?

我檢查了C11標準,但沒有找到與此相關的信息。

回答

5

非常好!您應該爲C11提交缺陷報告!

以下是在C11 7.21.6.2

相關部分... 的轉換指定包括在格式字符串所有後續字符,直到幷包括匹配的右括號(])。括號(掃描列表)之間的字符組成掃描集,除非左括號之後的字符是旋繞(^),在這種情況下,掃描集包含掃描列表中沒有出現在旋轉曲線和右括號之間的所有字符。

括號之間的字符的嚴格的解釋是,在不存在右括號的沒有這樣的字符,但在^存在下[後的第一個字符,這將是不一致。 gcc足以指出源代碼中的可能錯誤。實際行爲由C庫實現確定,但似乎沒有在C標準中指定。因此,這是一種未定義行爲的形式,恕我直言,應該真正記錄在標準中。

+0

謝謝!我建議你提交缺陷報告,因爲我不知道該去哪裏以及如何去做。 –

+1

我向C工作組祕書Daniel Plakosh發了一封電子郵件,我會在會議記錄上公佈你的信息。 – chqrlie

相關問題