打印
[应用方案]

printf打印数据异常的问题

[复制链接]
415|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mmbs|  楼主 | 2024-4-24 23:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


51 单片机 通过 printf 打印格式化数据的时候,不能使用 %d 之类的占位符,转而使用以下占位符:

待打印数据的大小        格式化的符号        备注
占位符 8位        bd/bu        bd:有符号8位数据 bu:无符号8位数据
占位符 16位        hd/hu        hd:有符号16位数据 hu:无符号16位数据
占位符 32位        ld/lu        ld:有符号32位数据 lu:无符号32位数据


使用特权

评论回复
沙发
jasontu| | 2024-4-25 09:53 | 只看该作者
#include <stdio.h>

void test_printf (void) {
  char a = 10;
  int b  = 54321;
  long c = 0x7FFFFFFF;

  unsigned char x = 'B';
  unsigned int y  = 12345;
  unsigned long z = 0x4A6F6E00;

  float f = 10.1;
  float g = 33.59;

  char buf [] = "Test String";//不定长数组
  char *p = buf;

  printf ("char %bd int %d long %ld\n",a,b,c);
  printf ("Uchar %bu Uint %u Ulong %lu\n",x,y,z);
  printf ("xchar %bx xint %x xlong %lx\n",x,y,z);
  printf ("String %s is at address %p\n",buf,p);
  printf ("%f != %g\n", f, g);
  printf ("%*f != %*g\n", (int)8, f, (int)8, g);
}

使用特权

评论回复
板凳
LEDyyds| | 2024-4-25 11:49 | 只看该作者
还有这个说法吗

使用特权

评论回复
地板
laocuo1142| | 2024-4-25 15:42 | 只看该作者
可能是格式字符串错误

使用特权

评论回复
5
flycamelaaa| | 2024-4-25 19:00 | 只看该作者
变量未初始化?

使用特权

评论回复
6
powerantone| | 2024-4-25 21:00 | 只看该作者
如果你尝试打印超过缓冲区大小的字符串,可能会导致输出异常,甚至可能引发程序崩溃。

使用特权

评论回复
7
stormwind123| | 2024-4-25 21:00 | 只看该作者
如果你打印的指针指向无效的内存地址,或者指针未初始化,这可能会导致未定义的行为,包括打印异常数据。

使用特权

评论回复
8
probedog| | 2024-4-25 22:00 | 只看该作者
当你打印浮点数时,宽度和精度设置不当可能导致输出看起来异常。

使用特权

评论回复
9
classroom| | 2024-4-25 22:30 | 只看该作者
某些情况下,你的程序可能受到区域设置(locale)的影响,导致打印的数字格式与预期不符(例如,使用逗号作为千位分隔符)。

使用特权

评论回复
10
olivem55arlowe| | 2024-4-29 14:33 | 只看该作者
在Keil C51中,当我们使用printf函数输出单字节变量时,应使用%bd或%bx作为占位符,而非标准的%d。

使用特权

评论回复
11
ccook11| | 2024-4-29 15:11 | 只看该作者
这些占位符是为了适应不同大小的数据类型而设计的。

使用特权

评论回复
12
bestwell| | 2024-5-2 21:18 | 只看该作者
使用了嵌入式系统不支持的占位符,或者占位符与传递给printf的参数类型不匹配,那么就会导致格式字符串错误。

使用特权

评论回复
13
beacherblack| | 2024-5-3 09:34 | 只看该作者
正确的格式化规定符是非常重要的。

使用特权

评论回复
14
updownq| | 2024-5-3 11:27 | 只看该作者
标准的printf函数可能被重载或简化,从而不支持标准的格式化占位符。

使用特权

评论回复
15
bartonalfred| | 2024-5-4 15:17 | 只看该作者
51单片机的编译器或库可能不支持某些标准的printf功能。

使用特权

评论回复
16
hudi008| | 2024-5-6 14:53 | 只看该作者
%bd: 打印有符号8位整数(char类型)
%bu: 打印无符号8位整数(unsigned char类型)
%hd: 打印有符号16位整数(int类型)
%hu: 打印无符号16位整数(unsigned int类型)
%ld: 打印有符号32位整数(long类型)
%lu: 打印无符号32位整数(unsigned long类型)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

179

主题

6370

帖子

3

粉丝