2015-09-03 65 views
0

下面的C代碼,C:爲什麼「sscanf」不會剪切結尾字符?

#include <stdio.h> 
int main() 
{ 
    char *source="{\"address\":\"10.10.2.130\"}"; 
    char ip[32]; 
    sscanf(source, "{\"address\":\"%s\"}", ip); 
    printf("%s\n%s\n", source, ip); 
    return 0; 
} 

我希望提取IP 10.10.2.130,但輸出顯示10.10.2.130" },爲什麼呢?

感謝。

+5

因爲'%s'格式意味着要讀取,直到它到達空白或字符串的末尾。 – Barmar

+2

如果您想要進行模式匹配,請使用正則表達式庫。 – Barmar

+0

我想你誤解了'sscanf'完全可以工作。它不會嘗試將輸入與您指定的模板進行匹配。 –

回答

1

的每一部分格式字符串執行時不會期待看到會發生什麼,因此%s與字符串的其餘部分匹配,格式字符串中的後續字符只是不匹配,因爲您要匹配已被讀取的字符。

您可能需要諸如%[^\"]s之類的內容,如果遇到報價,這些內容會停止閱讀。

1

%s當到達空白字符或源字符串結束時停止掃描。既然你要提取的字符串以"字符結尾,您可以使用%[^"]到上遇到的第一個"字符,如停止掃描:

sscanf(source, "{\"address\":\"%[^\"]\"}", ip); 
1

%s規格爲:

匹配一系列非空白字符。

由於尾隨的"}不是空白,所以包含在匹配中。

而是,您可以使用%[0-9.]格式來匹配數字和點。

sscanf(source, "{\"address\":\"%[0-9.]\"}", ip); 
相關問題