【问题标题】:Adding integers as char to create a string in C将整数添加为 char 以在 C 中创建字符串
【发布时间】:2017-08-30 16:42:18
【问题描述】:

我想问是否有办法将整数添加为 char 值并创建一个字符串。我写了一些代码,但只检测到最后一个数字

void binary(int decimal) {
  int modulus;
  char bin[9];
  while (decimal != 0) {
    modulus = decimal % 2;
    sprintf(bin, "%d", modulus);
    if (modulus == 1) {
      decimal--;
    }
    decimal = decimal / 2;
  }
  puts(bin);
}

如果小数点为10,则仅保留1 而不是0101。我该如何解决?我正在使用 Turbo C++ 3.0。

【问题讨论】:

  • sprintf(bin, "%d", modulus);你总是从前面写。
  • 这不是微不足道的,因为它把数字颠倒了。我已经发布了一个答案,但它打印了反转的二进制字符串,所以不好。之后递归或反转字符串应该可以解决它。
  • @Jean-FrançoisFabre OP 的预期结果是相反的。例如 0101 : 10 (base 10)
  • 注意:除法前不需要减少奇数。例如。整数除法中的 5/2 是 2,因为它向下舍入

标签: c string turbo-c


【解决方案1】:

这正是您的功能,稍作修改和 cmets。

二进制字符串仍然是相反的。

void binary(int decimal) {
  int modulus;
  char bin[9];
  char temp[2];   // temporary string for sprintf

  bin[0] = 0;     // initially binary string set to "" (empty string)

  while (decimal != 0) {
    modulus = decimal % 2;

    sprintf(temp, "%d", modulus);  // print '1' or '0' to temporary string
    strcat(bin, temp);             // concatenate temporary string to bin

    if (modulus == 1) {
      decimal--;
    }
    decimal = decimal / 2;
  }
  puts(bin);
}

有更有效的方法可以实现这一点,尤其是利用左移运算符 (<<),这样您就可以直接构造二进制字符串,而无需在末尾反转它。

【讨论】:

  • 感谢您的回答。实际上,我按照 cmets 的建议编写了相同的代码。但是,您的代码确认了我的代码。谢谢!
  • 那不是产生倒数吗?
  • @Jean-FrançoisFabre 是的,请阅读答案的第二句。
  • 好的,所以我要取消删除我的答案,它更简单,因为它不使用临时 & strcat。
  • @king_nak 使用sprintf 将字符串打印到自身中肯定会导致未定义的行为:stackoverflow.com/questions/1973572/…
【解决方案2】:

这是一个将十进制打印为二进制的函数:

void print_binary(int num)
{
    int pos = (sizeof(int) * 8) - 1;
    printf("%10d: ", num);

    for (int i = 0; i < (int)(sizeof(int) * 8); i++) {
        char c = num & (1 << pos) ? '1' : '0';
        putchar(c);
        if (!((i + 1) % 8))
            putchar(' ');
        pos--;
    }
    putchar('\n');
}

输出:

        42: 00000000 00000000 00000000 00101010

【讨论】:

  • 难道没有用整数创建字符串吗?你的答案是我想要的,只是我想知道我做错了什么
【解决方案3】:

当然,您正在同一个bin 位置打印,而不是移动您的“光标”。

在字符串上声明一个指针并在每个 sprintf 之后递增它,应该可以工作,因为 sprintf 只发出 1 位数字 + 空终止字符。

char bin[9];
char *ptr = bin;
  while (decimal != 0) {
    modulus = decimal % 2;
    sprintf(ptr, "%d", modulus);
    ptr++;

生成字符串,但反转(因为首先处理低位)。只需将其反转或稍后反转即可。

 int l = strlen(bin);
 for (i=0;i<l;i++)
 {
     putc(bin[l-i-1]);
 }
 putc("\n");

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2022-01-10
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多