3 回答
TA贡献1851条经验 获得超3个赞
这是另一个优化的选项,用于传递分配的缓冲区。确保尺寸正确。
// buffer must have length >= sizeof(int) + 1
// Write to the buffer backwards so that the binary representation
// is in the correct order i.e. the LSB is on the far right
// instead of the far left of the printed string
char *int2bin(int a, char *buffer, int buf_size) {
buffer += (buf_size - 1);
for (int i = 31; i >= 0; i--) {
*buffer-- = (a & 1) + '0';
a >>= 1;
}
return buffer;
}
#define BUF_SIZE 33
int main() {
char buffer[BUF_SIZE];
buffer[BUF_SIZE - 1] = '\0';
int2bin(0xFF000000, buffer, BUF_SIZE - 1);
printf("a = %s", buffer);
}
TA贡献1860条经验 获得超9个赞
一些建议:
空终止您的字符串
不要使用幻数
检查的返回值 malloc()
不要转换的返回值 malloc()
对二进制表示法感兴趣的话,请使用二进制运算而不是算术运算
不需要循环两次
这是代码:
#include <stdlib.h>
#include <limits.h>
char * int2bin(int i)
{
size_t bits = sizeof(int) * CHAR_BIT;
char * str = malloc(bits + 1);
if(!str) return NULL;
str[bits] = 0;
// type punning because signed shift is implementation-defined
unsigned u = *(unsigned *)&i;
for(; bits--; u >>= 1)
str[bits] = u & 1 ? '1' : '0';
return str;
}
TA贡献1828条经验 获得超4个赞
您的字符串不是以null终止的。确保'\0'在字符串末尾添加一个字符;或者,您可以用calloc代替分配它malloc,这将使返回给您的内存归零。
顺便说一句,此代码还有其他问题:
使用时,它在您调用内存时分配内存,而调用方则负责free()分配已分配的字符串。如果只是在printf通话中调用它,则会泄漏内存。
它使号码两次通过,这是不必要的。您可以一次完成所有操作。
这是您可以使用的替代实现。
#include <stdlib.h>
#include <limits.h>
char *int2bin(unsigned n, char *buf)
{
#define BITS (sizeof(n) * CHAR_BIT)
static char static_buf[BITS + 1];
int i;
if (buf == NULL)
buf = static_buf;
for (i = BITS - 1; i >= 0; --i) {
buf[i] = (n & 1) ? '1' : '0';
n >>= 1;
}
buf[BITS] = '\0';
return buf;
#undef BITS
}
用法:
printf("%s\n", int2bin(0xFF00000000, NULL));
第二个参数是指向缓冲区要存储在结果字符串。如果没有缓冲,你可以通过NULL和int2bin将写入static缓冲区,回报给你。与原始实现相比,此方法的优势在于,调用者不必担心free()会获取返回的字符串。
缺点是只有一个静态缓冲区,因此后续调用将覆盖先前调用的结果。您无法保存多个调用的结果供以后使用。同样,它也不是线程安全的,这意味着如果您从不同的线程中以这种方式调用该函数,它们可能会破坏彼此的字符串。如果有可能,您需要传递自己的缓冲区而不是传递NULL,如下所示:
char str[33];
int2bin(0xDEADBEEF, str);
puts(str);
- 3 回答
- 0 关注
- 726 浏览
添加回答
举报