天天看点

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具体介绍可参看