我已经使用rand函数来生成一个随机数。我想收集这一数字到char buffer[10]
或一个char *ptr
将整数转换为字符串
main()
{
char *ptr;
int a;
srand(time(NULL));
a = rand();
}
我想价值在复制到缓冲区或char *ptr
点吧,请帮我在这
我已经使用rand函数来生成一个随机数。我想收集这一数字到char buffer[10]
或一个char *ptr
将整数转换为字符串
main()
{
char *ptr;
int a;
srand(time(NULL));
a = rand();
}
我想价值在复制到缓冲区或char *ptr
点吧,请帮我在这
仅供参考,这里是如何使用snprintf
当你不知道提前缓冲区需要多大是:
size_t len = snprintf(NULL, 0, "%d", a) + 1;
char *ptr = malloc(len);
if (!ptr) {
// memory allocation failed, you must decide how to handle the error
} else {
snprintf(ptr, len, "%d", a);
... // some time later
free(ptr);
}
然而,由于你的代码写在一个古老的风格(在函数的开始没有返回类型为main
和声明的所有变量),它可能是你的C实现没有snprintf
。请注意,微软的_snprintf
不是直接的替代品:当它截断输出时,它不会告诉你需要写入多少数据。
在这种情况下,您可以使用值RAND_MAX
来计算该值可能具有多少位数,因此您的缓冲区需要多大。 10在Linux上是不够的,其中RAND_MAX
是2147483647
,所以你需要11个字节作为你的nul结尾的字符串。
顺便说一句,我忽略了snprintf
指示除截断之外的错误的可能性,它用返回值-1进行处理。这是因为%d
不能失败。
您可以使用
char x[10];
sprintf(x, "%d", integer_number);
请改用'snprintf'。 –
@Petriuc Florin:嗨,如果我想使用char * ptr,该怎么做? – Manny
char ptr[10];
sprintf(ptr,"%d",a);
如果你想使用char *ptr
char *ptr = malloc(10*sizeof(char));
sprintf(ptr,"%d",a);
// And If you want to free allocated space for ptr some where:
free(ptr);
使用snprintf()
更安全。
int answer = 42;
char buf[32];
snprintf(buf, sizeof(buf), "%d", answer);
printf("The answer is: %s\n", buf);
如果要使用动态分配的缓冲区:
const size_t size = 32;
char *buf = malloc(size);
if (buf != NULL) {
snprintf(buf, size, "%d", answer);
}
只有在截断输出比缓冲区溢出更不危险的错误时,才使用“snprintf”而不检查返回值来“更安全”。在这种情况下,这是公平的,因为'rand()'无论如何不能保证均匀分布,所以谁在乎你是否通过截断某些值来进一步偏好它?一般来说,使用长度受限的字符串函数而不检查截断是非常危险的,并且可以(尽管不那么频繁)导致安全缺陷与由缓冲区溢出引起的缺陷一样严重。 –
@SteveJessop“函数snprintf()和vsnprintf()将大部分字节(包括终止空字节('\ 0'))写入到str中。” - 即使它们被截断,也有一个NUL终止符。有什么不安全的?另外,即使'int'长度为64位,'2^63-1'仍然只是'9 * 10^18',所以19个字节足以打印它,我提供的32个字节也是如此。 – 2012-11-26 10:02:26
“有什么不安全的?” - 取决于你使用的字符串值。例如,如果您将它用作chroot jail的目录,那么您可能会将该进程“限制”到一个太高的目录,并允许它访问它不应该访问的文件。一般来说,使用错误的数据通常是不安全的,或者与您的函数记录的行为不同。所以你需要检查错误。如果我们接受你的“也是”的论点,你的代码是安全的,因为缓冲区足够大,那么sprintf将同样安全。只有当缓冲区可能太小时,snprintf才是“更安全”的。 –
如果编译器是GCC:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
main()
{
char *ptr;
int a;
srand(time(NULL));
a = rand();
asprintf(&ptr, "%d", a);
printf("%s\n", ptr);
//DO SOMETHING
free(ptr);
}
[_itoa()](http://msdn.microsoft.com/en-us/library/yakksftt(V = vs.71)的.aspx) – acraig5075