[英]Using sprintf to convert an unsigned long to char array producing 0
我正在嘗試使用 c 中的 sprintf function 轉換無符號長整數。 代碼如下:
char ID[6];
sprintf(ID,"%lu",a.id);
a.id
是一個傳入的數字,范圍可以從 0 > 但無論如何我只想要前 6 個。 使用printf("%lu",a.id);
在轉換之前打印正確的數字,但是一旦我嘗試從 char 打印字符串,結果是0
。 不太確定為什么會發生這種情況,任何建議將不勝感激。
...一旦我嘗試從 char 打印字符串,結果為 0
代碼存在未定義行為(UB) 的風險:緩沖區溢出、潛在的錯誤說明符。
但無論如何我只想要前6個。
確保緩沖區足夠大,可容納 6 個字符和一個終止null 字符。
//char ID[6]; char ID[6+1];
使用% some_unsigned_constant
處理超出預期范圍0...999999
的a.id
。 這確實打印了最后6 個。
// sprintf(ID,"%lu",a.id); sprintf(ID,"%lu",a.id % 1000000u);
作為a.id
的類型,未發布,2 個步驟可能有助於確保使用匹配的打印說明符。
// sprintf(ID,"%lu",a.id % 1000000u); unsigned long ul = a.id sprintf(ID,"%lu", ul % 1000000u);
要打印前6 個,即使在 0...999999 范圍之外,也可以使用snprintf()
,它只打印前 6 個。
char ID[6+1];
snprintf(ID, sizeof ID, "%lu", (unsigned long) a.id);
做OP想要的正確方法是
#include <stdio.h>
int main()
{
char ID[6];
unsigned long x = 3453342432;
int r = snprintf(ID, sizeof(ID), "%lu",x);
printf("%d %s\n", r, ID);
return 0;
}
請注意, snprintf
結果是已寫入的字符數。 其他人指出,您必須保留一個字符的額外空間來終止NULL
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.