我似乎不太了解printf()
是如何用C格式化char数组的输出的。我有一些代码,目的是将整数转换为二进制字符字符串并打印。该代码可以工作到我要打印从integerToString()
返回的字符串的地步,因为它不打印字符串的内容。
我已经检查gdb以确保res
调用之前str
和printf()
都包含正确值的数组。我还尝试打印*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);
}
答案 0 :(得分:3)
此位str[i] = value % 2;
为数组中的字符分配0或1,但是printf
需要一个字符串,因此您希望将ASCII字符分配为零或一。当前,您正在分配null和SoH(标头的开始,控件A)的混合。由于ASCII 1比ASCII 0多1:
str[i] = value % 2 + '0'; /* ASCII zero plus this bit's value */
此外,循环在i = 0处停止,因此从不设置str [0]。幸运/不幸的是,它必须包含二进制值0。
答案 1 :(得分:0)
正如纸杯蛋糕指出的那样,您在转换时遇到了问题,但是我认为null的原因是缺少integerToString声明。 由于此函数的定义在使用后,因此C会假定它返回一个int -这是默认操作。如果您使用的是64位系统,则会丢弃许多返回的位。您可以通过添加前向声明或反转源中两个函数的顺序来解决此问题。后者是许多C程序员为避免笨拙的正向声明而采用的惯用法。
通常,您的编译器在以后发现与所假定的函数定义不匹配的函数定义时会抱怨。如果您的编译器没有执行此操作,那么您确实应该得到一个可以执行的操作。如今,有许多免费的编译器可用,而且实际上没有理由忍受糟糕的编译器。
如果您忽略了编译器抱怨的问题,那么您就不应该这样做。