无法在c中打印f()char数组
Unable to printf() char array in c
我似乎不明白 printf()
如何在 C 中格式化 char 数组的输出。我有一些代码,其目的是将整数转换为二进制字符串,然后打印它。代码工作到我打印从 integerToString()
返回的字符串的地步,因为它不打印字符串的内容。
我检查了 gdb 以确保 res
和 str
在 printf()
调用之前都包含正确值的数组。我也试过打印 *res
而不是 res
,而是 returns (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] = '[=10=]';
return(str);
}
此位 str[i] = value % 2;
将 0 或 1 分配给数组中的字符,但 printf
需要一个字符串,因此您想将 ASCII 字符分配为零或一。您当前分配的是空值和 SoH 的混合(header、control-A 的开头)。由于 ASCII 一比 ASCII 零多一:
str[i] = value % 2 + '0'; /* ASCII zero plus this bit's value */
此外,循环在 i = 0 处停止,因此永远不会设置 str[0]。 Luckily/unluckily 它必须包含二进制值 0。
正如 cupcake 指出的那样,您在转换时遇到了问题,但我认为 null 的原因是缺少对 integerToString 的声明。
因为这个函数的定义是在它使用之后,C 会假定它 returns 一个 int ——这是一个默认动作。如果您使用的是 64 位系统,这将丢弃许多返回的位。您可以通过添加前向声明或颠倒源代码中两个函数的顺序来解决此问题。后者是许多 C 程序员为避免笨拙的前向声明而采用的习惯用法。
通常,当您的编译器后来发现一个与它假定的不匹配的函数定义时,它会报错。如果你的编译器不这样做,你真的应该得到一个这样做的。现在有很多免费的编译器,真的没有理由忍受一个糟糕的编译器。
如果您忽略了编译器对此的抱怨,那么您不应该这样做。
我似乎不明白 printf()
如何在 C 中格式化 char 数组的输出。我有一些代码,其目的是将整数转换为二进制字符串,然后打印它。代码工作到我打印从 integerToString()
返回的字符串的地步,因为它不打印字符串的内容。
我检查了 gdb 以确保 res
和 str
在 printf()
调用之前都包含正确值的数组。我也试过打印 *res
而不是 res
,而是 returns (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] = '[=10=]';
return(str);
}
此位 str[i] = value % 2;
将 0 或 1 分配给数组中的字符,但 printf
需要一个字符串,因此您想将 ASCII 字符分配为零或一。您当前分配的是空值和 SoH 的混合(header、control-A 的开头)。由于 ASCII 一比 ASCII 零多一:
str[i] = value % 2 + '0'; /* ASCII zero plus this bit's value */
此外,循环在 i = 0 处停止,因此永远不会设置 str[0]。 Luckily/unluckily 它必须包含二进制值 0。
正如 cupcake 指出的那样,您在转换时遇到了问题,但我认为 null 的原因是缺少对 integerToString 的声明。 因为这个函数的定义是在它使用之后,C 会假定它 returns 一个 int ——这是一个默认动作。如果您使用的是 64 位系统,这将丢弃许多返回的位。您可以通过添加前向声明或颠倒源代码中两个函数的顺序来解决此问题。后者是许多 C 程序员为避免笨拙的前向声明而采用的习惯用法。
通常,当您的编译器后来发现一个与它假定的不匹配的函数定义时,它会报错。如果你的编译器不这样做,你真的应该得到一个这样做的。现在有很多免费的编译器,真的没有理由忍受一个糟糕的编译器。
如果您忽略了编译器对此的抱怨,那么您不应该这样做。