2013-08-02 84 views
1

在C中,使用的sscanf時,對於格式參數,有使用之間的差:差255 [^ 0] s和%255C

%255[^\0]s 

和:

%255c 

速度更快嗎?上面的一個會給出不同的結果嗎?

回答

6

問題當然是不是 OP的意圖。

的OP請求

"%255[^\0]s" // a seemingly format specifier %255[^\0] and the letter 's' 
"%255c" 

當然格式

之間的 sscanf(buf, format, dest)差OP想要的格式

的之間

"%255[^\0]" // a seemingly format specifier %255[^\0] 
"%255c" 

OR

"%255s" // format specifier %255s 
"%255c" 
sscanf(buf, format, dest)差異是 而不是人們可能會想到的格式。這是 相同格式 "%255[^"sscanf()不知道有東西通過顯式空字符 '\0'。由於格式說明符以 [開頭,但不以匹配 ]結尾,因此它是無效的說明符。 「如果轉換規範無效, 行爲未定義。」

這也適用於原始"%255[^\0]s"行爲是undefined

以下是強烈的突出問題"%255s""%255c"

  • "%255c"之間

      消耗領先的空格。 "%255s"確實消耗無限領先的空白,掃描它們,但是 不是將它們保存到 dest
    1. "%255c"會掃描空格並將它們保存到dest"%255s",它發現一個非空白區域後,將停止掃描,如果它遇到一個空白區域。
    2. 兩者都將掃描最多255個字符,並將掃描的字符放入dest
    3. "%255c"追加\0所以dest應與255 char應對。
    4. "%255s",如果它掃描至少1炭,將追加一個\0,所以dest應與256 char應付。
    5. 既不會掃描\0掃描buf停止\0sscanf()"%255c"將在fscanf()中掃描\0。這是不常見的,因爲fscanf()在文件中有\0時使用得並不多。

    如果出現任何速度差異,肯定是取決於實施。

  • +1

    與'\ 0'位的好處。 –

    +0

    +1:使用'gcc -Wall -Wextra -c x13.c'編譯,會得到如下警告:'x13.c:函數'main':'和0x35: ']'代表'%['format'和 'x13.c:9:警告:嵌入的'\ 0'格式。它並不完全清楚'scanf()'做了什麼,但是因爲行爲未定義,所以任何事情都可以。 –

    +2

    多汁的答案!標記爲正確。 – CHRIS

    1

    不能確定速度,但結果有差異。

    首先,%255c會(假設您正在掃描的字符串中至少有255個字符)讀取255個字符,而不管它們是什麼。另一方面,%255[^\0]s將讀取多達255個非空白個字符。

    其次,因爲字符串已被\0終止,所以正則表達式的[^\0]部分是多餘的,因爲sscanf決不會將空終止符視爲字符串的一部分。