首页 > 解决方案 > 在 C 中将 int 转换为二进制字符串

问题描述

我正在尝试将整数转换为二进制字符串(请参见下面的代码)。我已经查看了几个类似的代码片段,但似乎无法找到为什么这不起作用的原因。它不仅不会产生正确的输出,而且根本没有输出。有人可以向我详细解释我做错了什么吗?

#include <stdio.h>
#include <stdlib.h>

char* toBinaryString(int n) {
  char *string = malloc(sizeof(int) * 8 + 1);
  if (!string) {
    return NULL;
  }
  for (int i = 31; i >= 0; i--) {
    string[i] = n & 1;
    n >> 1;
  }
  return string;
}

int main() {
  char* string = toBinaryString(4);
  printf("%s", string);
  free(string);
  return 0;
}

标签: cpointers

解决方案


线

string[i] = n & 1;

正在分配整数01string[i]。它们通常不同于字符'0''1'。您应该添加'0'将整数转换为字符。

另外,作为@EugeneSh。指出,线

n >> 1;

没有效果。它应该是

n >>= 1;

更新n' 值。

此外,正如@JohnnyMopp 指出的那样,您应该通过添加空字符来终止字符串。

还有一点,您应该检查是否malloc()成功。(它在函数中完成,但在打印结果之前toBinaryString没有签入)main()

最后,在使用for 的大小时使用幻数31来初始化for循环看起来不太好。sizeof(int)malloc()

固定代码:

#include <stdio.h>
#include <stdlib.h>

char* toBinaryString(int n) {
  int num_bits = sizeof(int) * 8;
  char *string = malloc(num_bits + 1);
  if (!string) {
    return NULL;
  }
  for (int i = num_bits - 1; i >= 0; i--) {
    string[i] = (n & 1) + '0';
    n >>= 1;
  }
  string[num_bits] = '\0';
  return string;
}

int main() {
  char* string = toBinaryString(4);
  if (string) {
    printf("%s", string);
    free(string);
  } else {
    fputs("toBinaryString() failed\n", stderr);
  }
  return 0;
}

推荐阅读