在C中从整数转换为字符串

时间:2014-11-13 07:46:47

标签: c

我想将整数转换为C中的字符串。我尝试了以下代码,但程序不断输出一个9位数字。有人知道错误是什么,我该如何解决?

int num = 158;
char str[5];
sprintf(str, "%d" ,num);
printf("The result is: %d" , sprintf);

谢谢!

3 个答案:

答案 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位数字。对于具有更多数字的值,则代码将超出该缓冲区。