我想将整数转换为C中的字符串。我尝试了以下代码,但程序不断输出一个9位数字。有人知道错误是什么,我该如何解决?
int num = 158;
char str[5];
sprintf(str, "%d" ,num);
printf("The result is: %d" , sprintf);
谢谢!
答案 0 :(得分:6)
使用%d打印整数
printf("The result is: %d\n", num);
或带有%s的字符串表示
printf("The result is: %s\n" , str);
通过
printf("The result is: %d" , sprintf);
您正在打印函数sprintf的地址的十进制表示。例如:
#include <stdio.h>
int main() {
int num = 158;
char str[5];
sprintf(str, "%d" ,num);
printf("The result is: %d\n", sprintf);
printf("The result is: %8x\n", sprintf);
}
静态编译,以便更容易找到sprintf的地址。
➜ ~ [4] [Thu 13] $ gcc file.c -o bin -static
在代码中,我还打印十六进制表示,这更容易在二进制文件中找到。输出:
The result is: 4200768
The result is: 401940
您可以在ELF可执行文件中实际检查sprintf的线性地址:
➜ ~ [4] [Thu 13] $ nm bin | grep sprintf
0000000000480830 W asprintf
0000000000480830 T __asprintf
0000000000480830 T ___asprintf
0000000000401940 T _IO_sprintf
0000000000480a40 T _IO_vasprintf
00000000004019d0 T __IO_vsprintf
00000000004019d0 T _IO_vsprintf
0000000000401940 T sprintf
0000000000401940 T __sprintf
0000000000480a40 W vasprintf
00000000004019d0 W vsprintf
正如所料,0x0000000000401940。
答案 1 :(得分:3)
将printf更改为printf("The result is: %s" , str);
。
%s
是字符串的说明符,您的字符串名称是str
。使用不正确的%说明符进行打印会调用未定义的行为。
答案 2 :(得分:2)
printf("The result is: %d" , sprintf);
此代码尝试打印sprintf
这是一个函数。所以它的地址传递给printf
。那不是你打算做的。更不用说带有地址的%d
会导致未定义的行为。
要打印您制作的字符串,请执行以下操作:
printf("The result is: %s", str);
请注意,您必须使用%s
格式字符串,因为您提供的参数是字符串。
如果您只想打印该值,则可以删除str
,移除对sprintf
的调用,然后获取printf
以执行格式设置:
printf("The result is: %d", num);
这样做的一个优点是它可以避免您必须决定分配多大的缓冲区。您分配了一个长度为5的缓冲区,可以接受最多4位数字的数字,如果是负数则接受3位数字。对于具有更多数字的值,则代码将超出该缓冲区。