使用C以二进制表示形式打印int

我在寻找一个允许我打印int二进制表示形式的函数。到目前为止,我所拥有的是:


char *int2bin(int a)

{

 char *str,*tmp;

 int cnt = 31;

 str = (char *) malloc(33); /*32 + 1 , because its a 32 bit bin number*/

 tmp = str;

 while ( cnt > -1 ){

      str[cnt]= '0';

      cnt --;

 }

 cnt = 31;

 while (a > 0){

       if (a%2==1){

           str[cnt] = '1';

        }

      cnt--;

        a = a/2 ;

 }

 return tmp;


}

但是当我打电话


printf("a %s",int2bin(aMask)) // aMask = 0xFF000000

我得到类似的输出;


0000000000000000000000000000000000000000xtpYy(还有一堆未知字符。


这是功能上的缺陷还是我在打印字符数组的地址或其他内容?抱歉,我看不到哪里出了问题。


注意:代码从这里


编辑:这不是家庭作业,仅供参考,我正在尝试用一种不熟悉的语言调试其他人的图像处理例程。但是,如果因为它是一个基本概念而被标记为家庭作业,那么公平竞争就可以了。


撒科打诨
浏览 727回答 3
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 stringchar *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 33int main() {    char buffer[BUF_SIZE];    buffer[BUF_SIZE - 1] = '\0';    int2bin(0xFF000000, buffer, BUF_SIZE - 1);    printf("a = %s", buffer);}

慕码人2483693

一些建议:空终止您的字符串不要使用幻数检查的返回值 malloc()不要转换的返回值 malloc()对二进制表示法感兴趣的话,请使用二进制运算而不是算术运算不需要循环两次这是代码:#include <stdlib.h>#include <limits.h>char * int2bin(int i){&nbsp; &nbsp; size_t bits = sizeof(int) * CHAR_BIT;&nbsp; &nbsp; char * str = malloc(bits + 1);&nbsp; &nbsp; if(!str) return NULL;&nbsp; &nbsp; str[bits] = 0;&nbsp; &nbsp; // type punning because signed shift is implementation-defined&nbsp; &nbsp; unsigned u = *(unsigned *)&i;&nbsp; &nbsp; for(; bits--; u >>= 1)&nbsp; &nbsp; &nbsp; &nbsp; str[bits] = u & 1 ? '1' : '0';&nbsp; &nbsp; return str;}

明月笑刀无情

您的字符串不是以null终止的。确保'\0'在字符串末尾添加一个字符;或者,您可以用calloc代替分配它malloc,这将使返回给您的内存归零。顺便说一句,此代码还有其他问题:使用时,它在您调用内存时分配内存,而调用方则负责free()分配已分配的字符串。如果只是在printf通话中调用它,则会泄漏内存。它使号码两次通过,这是不必要的。您可以一次完成所有操作。这是您可以使用的替代实现。#include <stdlib.h>#include <limits.h>char *int2bin(unsigned n, char *buf){&nbsp; &nbsp; #define BITS (sizeof(n) * CHAR_BIT)&nbsp; &nbsp; static char static_buf[BITS + 1];&nbsp; &nbsp; int i;&nbsp; &nbsp; if (buf == NULL)&nbsp; &nbsp; &nbsp; &nbsp; buf = static_buf;&nbsp; &nbsp; for (i = BITS - 1; i >= 0; --i) {&nbsp; &nbsp; &nbsp; &nbsp; buf[i] = (n & 1) ? '1' : '0';&nbsp; &nbsp; &nbsp; &nbsp; n >>= 1;&nbsp; &nbsp; }&nbsp; &nbsp; buf[BITS] = '\0';&nbsp; &nbsp; return buf;&nbsp; &nbsp; #undef BITS}用法:printf("%s\n", int2bin(0xFF00000000, NULL));第二个参数是指向缓冲区要存储在结果字符串。如果没有缓冲,你可以通过NULL和int2bin将写入static缓冲区,回报给你。与原始实现相比,此方法的优势在于,调用者不必担心free()会获取返回的字符串。缺点是只有一个静态缓冲区,因此后续调用将覆盖先前调用的结果。您无法保存多个调用的结果供以后使用。同样,它也不是线程安全的,这意味着如果您从不同的线程中以这种方式调用该函数,它们可能会破坏彼此的字符串。如果有可能,您需要传递自己的缓冲区而不是传递NULL,如下所示:char str[33];int2bin(0xDEADBEEF, str);puts(str);
打开App,查看更多内容
随时随地看视频慕课网APP