【问题标题】:Unable to printf() char array in c无法在c中打印f()字符数组
【发布时间】:2019-02-12 06:12:48
【问题描述】:

我似乎不明白printf() 如何在 C 中格式化 char 数组的输出。我有一段代码,其目的是将整数转换为二进制字符串,然后打印出来。代码一直有效,直到我打印从integerToString() 返回的字符串,因为它不打印字符串的内容。

我检查了 gdb 以确保 resstrprintf() 调用之前包含正确值的数组。我也尝试过打印*res 而不仅仅是res,但这会返回(null)。我错过了什么?指针有什么我没有掌握的吗?

非常感谢。

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

int main () {   
  printf("Please enter a positive integer: ");
  unsigned int input;

  scanf("%d", &input);

  char* res = integerToString(input);
  printf("Represented in binary that integer is: %s\n", res);
}

char* integerToString(unsigned int number){
  unsigned int value = number; 

  char* str;
  str = malloc(33); //32 bits for the string, +1 null value on the end

  unsigned int i = 31;

  while (i > 0){
    str[i] = value % 2;
    value /= 2;
    i--;
  }
  str[32] = '\0';
  return(str); 
}

【问题讨论】:

  • printf("%032b", input) 还不够好?
  • str[i] = value % 2 应该是str[i] = value % 2 + '0'
  • 提示:你想用字符还是数字填充你的字符数组? '0'0 不是一回事。
  • @tadman: %b 不是标准的 C - 尽管它可能相当广泛地可用。
  • 永远不要在不打电话给free的情况下打电话给malloc

标签: c printf c-strings


【解决方案1】:

str[i] = value % 2; 这个位将 0 或 1 分配给数组中的字符,但 printf 需要一个字符串,因此您希望将 ASCII 字符分配为零或一。您当前正在分配空值和 SoH 的混合(标题的开头,控件-A)。由于 ASCII 1 比 ASCII 0 多 1:

str[i] = value % 2 + '0'; /* ASCII zero plus this bit's value */

此外,循环在 i = 0 处停止,因此永远不会设置 str[0]。幸运/不幸的是,它必须包含二进制值 0。

【讨论】:

  • 用当前代码试过这个,但仍然没有让它输出任何东西..虽然你是对的,但我没有考虑到 Ascii 转换
  • 我更新了答案@LordValkyrie - 看起来问题是缺少 str[0] 的分配
  • 仍然没有得到任何东西。我正在使用 user3386109 建议的循环 for (i = 31; i &gt;= 0; i--) 以及您的 ascii 修复程序,但无济于事。
  • 我在我的代码中修复了循环(在编写了原始答案之后):` unsigned int i = 32;而 (i > 0){ i --; `这对我有用。 (增加起始值,将减量移动到循环的开头。)
  • 成功了!我想我的所有值都必须在数组或其他东西中偏移一个。非常感谢!
【解决方案2】:

正如cupcake 指出的那样,您的转换存在问题,但我认为null 的原因是缺少integerToString 的声明。 因为这个函数的定义是在它使用之后,C 将假定它返回一个 int ——这是一个默认动作。如果您在 64 位系统上,这将丢弃许多返回的位。您可以通过添加前向声明或反转源中两个函数的顺序来解决此问题。后者是许多 C 程序员为了避免笨拙的前向声明而采用的习语。

通常,当您的编译器稍后发现与它假设的函数定义不匹配时,您的编译器会抱怨。如果你的编译器不这样做,你真的应该得到一个这样做的。现在有很多免费的编译器可用,真的没有理由忍受一个糟糕的编译器。

如果您忽略了抱怨此问题的编译器,那么您不应该这样做。

【讨论】:

  • 需要使用 gcc 4.8.5 RedHat。而且我因为笨而忽略了发布,但我在顶部有以下函数原型:char* integerToString(unsigned int number);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2014-12-21
  • 2015-12-13
  • 1970-01-01
  • 2020-10-29
相关资源
最近更新 更多