c++輸出調試信息到vs中的輸出窗口

OutputDebugString函數

OutputDebugString(L"字符串");(VS中,#define OutputDebugString OutputDebugStringW )
OutputDebugStringW(L"字符串");
OutputDebugStringA(“字符串”);

sprintf、swprintf、wsprintf、sprintf_s、snprintf、asprintf、vsprintf函數

sprintf、swprintf函數:將格式化數據寫入字符串緩衝區中
int sprintf(char* buffer,const char* format [,argument] … );返回值爲存儲在buffer中的字節(bytes)的數目,不包含終止空字符
int swprintf(wchar_t
buffer,const wchar_t
format [,**argument] … );返回值爲存儲在buffer中的寬字符的數目,不包含終止空寬字符
buffer-指向將要寫入的字符串的緩衝區
format-格式控制字符串
[argument]…-可選參數,可以是任何類型的數據(使用此函數可將數字轉爲字符串)
格式化規定符:

  • %d 格式化爲十進制有符號整數輸出到緩衝區
  • %u 格式化爲十進制無符號整數輸出到緩衝區
  • %f 格式化爲浮點數輸出到緩衝區
  • %s 格式化爲字符串輸出到緩衝區
  • %c 格式化爲單個字符輸出到緩衝區
  • %e 格式化爲指數形式的浮點數輸出到緩衝區
  • %x 格式化爲無符號以十六進制表示的整數(a-f小寫輸出)輸出到緩衝區
  • %X 格式化爲無符號以十六進制表示的整數(a-f大寫輸出)輸出到緩衝區
  • %0 格式化爲無符號以八進制表示的整數輸出到緩衝區
  • %g 格式化爲自動選擇合適的表示法輸出到緩衝區
  • 說明:
    可以在"%“和字母之間插進數字表示最大場寬。例如: %3d 表示輸出3位整型數,不夠3位右對齊。%9.2f 表示輸出場寬爲9的浮點數,其中小數位爲2,整數位爲6,小數點佔一位,不夠9位右對齊。%8s 表示輸出8個字符的字符串,不夠8個字符右對齊。如果字符串的長度、或整型數位數超過說明的場寬,將按其實際長度輸出。但對浮點數,若整數部分位數超過了說明的整數位寬度,將按實際整數位輸出;若小數部分位數超過了說明的小數位寬度,則按說明的寬度以四捨五入輸出。另外,若想在輸出值前加一些0,就應在場寬項前加個0。例如:
    %04d 表示在輸出一個小於4位的數值時,將在前面補0使其總寬度爲4位。如果用浮點數表示字符或整型量的輸出格式,小數點後的數字代表最大寬度,小數點前的數字代表最小寬度。例如: %6.9s 表示顯示一個長度不小於6且不大於9的字符串。若大於9,則第9個字符以後的內容將被刪除。可以在”%“和字母之間加小寫字母l,表示輸出的是長型數。例如: %ld 表示輸出long整數,%lf 表示輸出double浮點數。 可以控制輸出左對齊或右對齊,即在”%“和字母之間加入一個”-" 號可說明輸出爲左對齊,否則爲右對齊。例如: %-7d 表示輸出7位整數左對齊。%-10s 表示輸出10個字符左對齊。
    wsprintf函數:將一系列的字符和數值輸入到字符串緩衝區。wsprintf其實分爲 wsprintfA 和 wsprintfW。VS中,#define wsprintf wsprintfW
    int __cdecl wsprintf(LPWSTR lpOut,LPCWSTR lpFmt,…);
    wsprintf的輸出緩衝區lpOut有 1024 字符限制,而且不支持浮點數的輸入輸出。
    swprintf(FPSString, L"%f", FPS); //正確
    wsprintf(FPSString, L"%f", FPS); //錯誤("%f")
    sprintf_s函數:是sprintf的安全版本,指定緩衝區長度來避免sprintf()存在的溢出風險,主要差在sprintf_s第二個參數,可以控制緩衝區大小
    int sprintf_s(char * buffer,size_t sizeofBuffer,const char *format, [argument] …);
    sizeOfBuffer-緩衝區大小。
    snprintf函數:
    int snprintf(char *str, size_t size, const char *format, …);
    size 的作用就是限制往str寫入不超過size個字節(包括了結尾的’/0’)。
    如果輸出因爲size的限制而被截斷,返回值將是“如果有足夠空間存儲,所 能輸出的字符數(不包括字符串結尾的’/0’)”,這個值和size相等或者比size大!也就是說,如果可以寫入的字符串是 “0123456789ABCDEF” 共16位,但是size限制了是10,這樣 snprintf() 的返回值將會是16 而不是 10 !
    asprintf函數
    int asprintf(char * *strp, const char *fmt, …);
    asprintf()可以說是一個增強版的sprintf(),在不確定字符串的長度時,非常靈活方便,能夠根據格式化的字符串長度,申請足夠的內存空間。此外,使用完後,必須通過free()釋放空間。不過,這是GNU擴展的C函數庫,不是標準C函數庫或者POSIX。
    vsprintf函數
    int vsprintf(char *string, char *format, va_list param);
    vsprintf()函數中的自變量是位於數組中的,數組元素的字符串之前都要加上百分號(%)。這個函數是“一步一步[step-by-step]”按順序執行。在第一個%後,將插入第一個數組元素;在第二個%後,將插入第二個數組元素,依次類推。

使用舉例

C++輸出16進制char數組到VS中的輸出窗口。

  char nSelectsat[6];   
  nSelectsat[5] = 0x60;
  nSelectsat[4] = 0x11;
  nSelectsat[3] = 0x90;
  nSelectsat[2] = 0x88;
  nSelectsat[1] = 0x80;
  nSelectsat[0] = 0x8a;
  //直接輸出數組名
  char out0[128] = { 0 };
  sprintf(out0, "%x\r", nSelectsat);
  OutputDebugStringA(out0);//4fe7bc(nSelectsat數組地址)
   //直接輸出*數組名
  char out00[128] = { 0 };
  sprintf(out00, "%x\r", *nSelectsat);
  OutputDebugStringA(out00);//ffffff8a(nSelectsat[0])
   //循環依次輸出數組元素
  char out8[128] = { 0 };
  for (int i = 0; i < 6; i++)
  {
   sprintf(out8, "%x", nSelectsat[i]);
   OutputDebugStringA(out8);
  }//ffffff8affffff80ffffff88ffffff901160
  //數組元素先轉換爲無符號類型 (unsigned char),再輸出
  //原因(參考8):%mx, 之類的格式輸出,輸出寬度不夠,忽略輸出寬度,直接全部輸出。在輸出前,轉換爲無符號類型,可以避免這種問題。
  //所有較短整型,在調用 printf 之類的輸出流函數的時候,會轉換爲int 類型,
  //而 char 類型缺省實現,並不是 unsigned char,通常是 signed char;
  //轉化爲int 的時候,會做符號位擴展
  char out9[128] = { 0 };
  for (int i = 0; i < 6; i++)
  {
   sprintf(out9, "%x", (unsigned char)nSelectsat[i]);
   OutputDebugStringA(out9);
  }//8a8088901160

參考

1、OutputDebugString函數
2、sprintf, swprintf 微軟
3、c++數據類型轉換 sprintf、swprintf、wsprintf
4、wsprintf
5、c++中sprintf和sprintf_s的區別
6、sprintf、snprintf、asprintf、vsprintf函數
7、整理:C++中sprintf()函數的使用詳解
8、字符數組用printf函數16進制輸出格式?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章