我已經使用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