将C中的十进制数转换为二进制数



我试图将十进制从[0, 255]转换为8位二进制数,其中每个位将用逗号和空格分隔。我尝试了以下操作(最终成功了,除了最后一位不需要任何分隔符):

#include <stdio.h>
#include <stdlib.h>
char* atobin(int input) {
    char *str = malloc(0);
    int index, count = 0;
    if (input > 255| input < 0) {
        printf ("Input out of range. Abort.n");
        exit(EXIT_FAILURE);
    }
    for (index = 7; index >= 0; index--) {
        *(str + (count++)) = (input >> index & 1) ? '1' : '0';
        *(str + (count++)) = ',';
        *(str + (count++)) = ' ';
    }
    *(str + count) = '';
    return str;
}
int main(int argc, char *argv[]) {
    printf("%sn", atobin(atoi(argv[1])));
    return EXIT_SUCCESS;
}

现在我有几个问题:

  1. 我使用malloc(0);就我而言,它会不从堆中分配内存。那么,它是如何/为什么工作的呢
  2. 声明*(str + count) = '';是否必要
  3. 有什么方法可以优化这个代码吗

更新

为了进行这个实验,我把atobin函数带到了一个.h文件中。这一次它制造了一些问题。现在我补充最后一个问题:

malloc参数的最小整数应该是多少?一些试错的方法让我猜测它应该是512。知道吗?

  1. 从malloc文档:

如果大小为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被取消引用。

它对你有效只是运气。尝试一些随机的malloc,然后免费,你很有可能(但不能保证)会崩溃。

  1. 此null终止字符串。这取决于如果需要的话你想如何使用字符串。你的例子中的printf需要它,因为这是它知道字符串何时结束的唯一方法。

  2. 对不起,我没有时间仔细看。

malloc(0)是有效的。它返回的是实现定义的。但是如果通过malloc(0)返回的指针访问对象,则会发生undefined behavoiur。你可以阅读这个相关的问题
在C中,由于字符串是以结尾的字符数组,因此最好使用*(str + count) = '';语句来设置字符串的最后一个字符。它在这个代码中工作,但最好总是在代码中设置字符串的末尾。如果位设置为0,它可能会起作用,因为它与终止字符串相同。

相关内容

  • 没有找到相关文章

最新更新