我正在编写一个函数,它接受整数值和指向字符的指针。 该函数将整数值转换为二进制并将其存储在char指针中。 char指针长度为16个字节。
代码片段:
void int2bin(u_int16_t addr_IP, char *Binary)
{
int count;
printf("IP1add = %d \n", Binary);
for (count = 0; count < 16; count++) {
if(addr_IP>0)
*(Binary + 15-count) = addr_IP & 0x1 ? '1':'0';
else
*(Binary + 15-count) = '0';
addr_IP>>=1;
}
}
int main(int argc, char *argv[])
{
u_int16_t senderIP_16[], u_int16_t receiverIP_16[];
char sender_IP_hi[16], sender_IP_low[16];
int2bin(senderIP_16[0], &sender_IP_hi);
int2bin(senderIP_16[1], &sender_IP_low);
}
在第一次调用函数时,它返回正确的值。但是在第二遍中,第一遍的值被附加到第二遍,即sender_IP_low
的长度变为32。
我该如何解决这个问题?
由于
答案 0 :(得分:3)
看起来您正在将sender_IP_low
打印为字符串,并且由于它不是以空值终止的,因此打印例程会继续打印相邻的缓冲区sender_IP_hi
。而且你可能很幸运,打印例程找到零并在分段错误之前停止。
一个快速解决方法是:
void int2bin(u_int16_t addr_IP, char *Binary) {
...
Binary[16] = 0; // terminate the string before returning
}
...
char sender_IP_hi[17], sender_IP_low[17]; // +1 for null terminator
虽然您的实施中还有其他一些可以解决的问题,但我只想集中精力回答您原来的问题。
答案 1 :(得分:1)
如果使用printf()打印数组:
void int2bin(u_int16_t addr_IP, char *Binary)
{
int count;
printf("IP1add = %d \n", Binary);
for (count = 0; count < 16; count++) {
if(addr_IP>0)
*(Binary + 15-count) = addr_IP & 0x1 ? '1':'0';
else
*(Binary + 15-count) = '0';
addr_IP>>=1;
}
// Put the NULL char in the last position
Binary[16] = '\0';
}
int main(int argc, char *argv[])
{
u_int16_t senderIP_16[], u_int16_t receiverIP_16[];
// One more char for storing the terminator character
char sender_IP_hi[17], sender_IP_low[17];
int2bin(senderIP_16[0], &sender_IP_hi);
int2bin(senderIP_16[1], &sender_IP_low);
}