天天看點

Keil C51 uv2中sprintf列印char的問題【keil官方例子 sprintf】

keil官方例子

sprintf

Home » Library Reference » Reference » sprintf

Summary
#include <stdio.h>

int sprintf (
  char *buffer,            /* storage buffer */
  const char *fmtstr       /* format string */
  <[>, arguments ...<]>);    /* additional arguments */
      
Description

The sprintf function formats a series of strings and numeric values and stores the resulting string in buffer. This function is similar to the printf routine, but it stores the formatted output in buffer rather than sending it to the output stream.

The fmtstr argument is a pointer to a format string which has the same form and function as the printf function's format string. The list of arguments are converted and output according to the corresponding format specifications in fmtstr.

Return Value The sprintf function returns the number of characters actually written to buffer.
See Also gets, puts, vprintf, vsprintf
Example
#include <stdio.h>

void tst_sprintf (void) {
  char buf [100];
  int n;
  int a,b;
  float pi;

  a = 123;
  b = 456;
  pi = 3.14159;

  n = sprintf (buf, "%f\n", 1.1);
  n += sprintf (buf+n, "%d\n", a);
  n += sprintf (buf+n, "%d %s %g", b, "---", pi);

  puts (buf);
}      

問題找到了 和string沒有關系 入口參數必須為int型變量 char型變量列印錯誤 直接指派66 系統預設是char型,我指派258結果列印就正确了,幅值(unsigned int)66就可以列印出“66”

分類: 單片機 c語言 2012-04-24 11:07 2166人閱讀 評論(3) 收藏 舉報 c buffer 測試

在Keil C51 uv2中使用運作時庫函數sprintf列印char類型變量時,使用%x或%d進行格式化時并沒有出現希望的數字,而是多列印了一個位元組。詳細的問題描述和解決辦法都在注釋中給出。SprintfTest.c程式清單如下,本測試在keil uv2中進行。

#include<reg52.h>

#include<stdio.h>

char buffer1[10];

char buffer2[10];

char buffer3[10];

char buffer4[10];

char buffer5[10];

void main()

{

 char c=0x55; 

//列印字元沒有問題

 sprintf(buffer1,"%c\r\n",c);//buffer1[]="U\r\n"

//列印十六進制和十進制會多列印一個位元組

 sprintf(buffer2,"%x\r\n",c);//buffer2[]="5500\r\n"

 sprintf(buffer3,"%d\r\n",c);//buffer3[]="21760"

//使用下面的方法可以列印出所希望的十六進制和十進制數

 sprintf(buffer4,"%x\r\n",c&0x00FF);//buffer4[]="55\r\n"

 sprintf(buffer5,"%d\r\n",c&0x00FF);//buffer5[]="85\r\n" 

 while(1);

}

相同的程式在VC 6中測試并未發現這個問題。如果你看到此問題并恰好知道問題的原因,甚至有更體面的解決辦法(而不是像我在這裡給出的解決辦法),請一定要RE哦

原因:因為spritnf 是個變參函數,除了前面兩個參數之外,後面的

參數都不是類型安全的,函數更沒有辦法僅僅通過一個“%X”就能得知當初函數調用前參數壓棧

時被壓進來的到底是個4 位元組的整數還是個2 位元組的短整數,是以采取了統一4 位元組的處理方式,是以可能會占用了了後邊的位元組記憶體。解決方法是強制轉換

 sprintf(buffer2,"%x\r\n",(int)c);

sprintf具體介紹可參看