繁体   English   中英

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

[英]Converting a decimal number to binary in 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) = '\0';
    return str;
}

int main(int argc, char *argv[]) {
    printf("%s\n", atobin(atoi(argv[1])));
    return EXIT_SUCCESS;
}

现在我有几个问题:

  1. 我用了malloc(0) ; 就我而言,它将不会从堆中分配任何内存。 那么,它如何/为什么起作用?
  2. 声明*(str + count) = '\\0'; 必要?
  3. 有什么方法可以优化此代码?

更新

为了进行此实验,我将atobin函数atobin一个.h文件中。 这次它产生了一些问题。 现在,我添加我的最后一个问题:

malloc参数应使用的最小整数是多少? 一些试错法让我猜测应该是512 任何想法?

  1. 从malloc文档中:

如果size为零,则返回值取决于特定的库实现(它可以是空指针,也可以不是空指针),但是不得取消对返回的指针的引用。

它为您工作只是运气。 尝试一些随机的malloc并在之后释放它们,那么您很有可能(但不能保证)会崩溃。

  1. 这将以null结尾的字符串。 取决于您需要使用字符串的方式。 您的示例中的printf需要它,因为这是它知道字符串何时结束的唯一方法。

  2. 抱歉,我没有时间仔细看。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM