2011-03-06 62 views
0
char * src_addr; 
char * dst_addr; 

src_addr = inet_ntoa(ip->ip_src); 
printf("src: %s\n", src_addr); 

dst_addr = inet_ntoa(ip->ip_dst); 
printf("dst: %s\n", dst_addr); 

printf("src: %s\n", src_addr); 

這將在第三個printf語句中輸出dst_addr。難道我做錯了什麼?C - 使用%s和char重複printf()*

回答

4

從文檔:inet_ntoa()返回靜態緩衝區中的dots-and-numbers字符串,每次調用該函數都會覆蓋該字符串。

因此,在你的情況下,第二次調用inet_ntoa會給你一個新的字符串,但在同一個緩衝區中,所以dst_addr指向與src_addr相同,它現在都指向新的目標字符串。

+0

那麼,解釋它。我非常關注printf行爲,我沒有把inet_ntoa視爲問題。謝謝! – Jeff 2011-03-06 18:16:36

1

我假設你使用的是IPv4。該功能不適用於IPv6;對於IPv6,使用inet_ntop()inet_pton()

該函數返回指向靜態內部緩衝區,inet_ntoa()不斷重複使用。您的src_addrdst_addr都將指向相同的緩衝區,並且最後一次調用inet_ntoa()所創建的字符串將被存儲在那裏。

+0

是的,這是涉及本地網絡流量的任務,所以我可以放心地假設它只是IPv4。 – Jeff 2011-03-06 18:21:50