2011-04-03 27 views
1

我必須爲我的C編程類編寫一個程序,將IPV4地址轉換爲IPV6。我們提供了轉換功能(下面的代碼實際轉換)。我在運行此代碼時遇到了XCode中的問題。我使用了中斷點,並發現當它遇到sprintf()線路時會崩潰。它崩潰:Program received signal: 「SIGABRT」. sharedlibrary apply-load-rules all。我在基於Windows的編譯器上測試了完全相同的代碼,並且運行良好。什麼會導致它在一個而不是另一個上失敗?我的程序可以在Windows上運行,而不是Mac在分級過程中,如果沒有修復程序,那麼我會在Windows上編寫程序的其餘部分,但我更願意使用Mac,因此任何幫助都是值得讚賞的。在xcode上崩潰,但不在windows上。 SIGABRT?

strncpy(IPV6, "0000:0000:0000:0000:0000:0000:", 30); 
    sscanf(input, "%u.%u.%u.%u", &a, &b, &c, &d); 
    sprintf(hexIP, "%02X%02X:%02X%02X", a, b, c, d); 
    strncat(IPV6, hexIP, 9); 

感謝

編輯

int makeIPV6(const char input[25], char IPV6[40], int style) 
{ 
     unsigned int a, b, c, d, e, f; 
     char hexIP[9]; 
     char hexMAC[24]; 
     printf("Stage 2\n"); 
     strncpy(IPV6, "0000:0000:0000:0000:0000:0000:", 30); 
     sscanf(input, "%u.%u.%u.%u", &a, &b, &c, &d); 
     sprintf(hexIP, "%02X%02X:%02X%02X", a, b, c, d); 
     strncat(IPV6, hexIP, 9); 

     return strlen(IPV6) 
} 
+0

你知道你在用什麼編譯器嗎?在Xcode中,您可以在您的項目上執行** Get Info **並檢查構建設置。你在Windows上使用什麼編譯器? – BoltClock 2011-04-03 04:31:48

+1

你可以發佈你的變量聲明嗎?看來你正在調用在Windows中巧合運行的未定義行爲。 – 2011-04-03 04:36:57

+0

在Mac上,它是GCC4.2(我認爲)和windows認爲它是mingw(我使用quincy所以它使用) – Darc 2011-04-03 04:39:04

回答

5

我看到一個緩衝區溢出:

char hexIP[9]; 
/*...*/ 
sprintf(hexIP, "%02X%02X:%02X%02X", a, b, c, d); 

您的格式字符串將產生9個字符,但sprintf將包括NUL終止符。嘗試製作hexIP十個字符。

而且要注意什麼喬伊·亞當斯說還是memset(IPV6, '\0', 40)你試圖把任何東西在它之前。

4

您已經下降strncpy的惱人的警告的家禽,即如果一個空終止不是字符串的第n個字節中,終止符不會被添加到輸出緩衝區。

char buffer[999]; 
strcpy(buffer, "xxxxxxxxxx"); 
strncpy(buffer, "12345", 5); 
puts(buffer); 

這將打印12345xxxxx而非12345

當你看到strncpy,警鐘應該在你的頭上熄滅。在這種情況下,你最好只是說:

strcpy(IPV6, "0000:0000:0000:0000:0000:0000:"); 

以您目前的代碼,一個空終止可能會或可能不會出現在IPV6字符串的結尾。

相關問題