Keil C51 uv2中sprintf打印char的问题

keil官方例子

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

getsputsvprintfvsprintf

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语言 2166人阅读 评论(3) 收藏 举报

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值