我必须为我的C编程类编写一个程序,将IPV4地址转换为IPV6。我们提供了执行转换的功能(以下代码执行实际转换)。我运行此代码时在XCode中遇到问题。我已经使用了断点,并确定当它到达sprintf()
行时它会崩溃。它崩溃了:Program received signal: “SIGABRT”.
sharedlibrary apply-load-rules all
。我在基于Windows的编译器上测试了完全相同的代码,运行正常。什么会导致它在一个而不是另一个上失败?我的程序必须在Windows上运行,而不是Mac用于评分过程,如果没有解决这个问题,那么我将在Windows上编写并编写其余的程序,但我更愿意使用Mac,所以任何帮助都是值得赞赏的。
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 :(得分:6)
我看到缓冲区溢出:
char hexIP[9];
/*...*/
sprintf(hexIP, "%02X%02X:%02X%02X", a, b, c, d );
您的格式字符串将产生9个字符,但sprintf
将包含nul终结符。尝试制作hexIP
十个字符。
在你试图把任何东西放进去之前,要注意Joey Adams所说的或memset(IPV6, '\0', 40)
。
答案 1 :(得分: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:");
使用当前代码,IP终结符可能会也可能不会出现在IPV6字符串的末尾。