簡體   English   中英

使用 sprintf 將 unsigned long 轉換為 char 數組,產生 0

[英]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個。

  1. 確保緩沖區足夠大,可容納 6 個字符和一個終止null 字符

     //char ID[6]; char ID[6+1];
  2. 使用% some_unsigned_constant處理超出預期范圍0...999999a.id 這確實打印了最后6 個。

     // sprintf(ID,"%lu",a.id); sprintf(ID,"%lu",a.id % 1000000u);
  3. 作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM