找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7111|回复: 11
打印 上一主题 下一主题
收起左侧

C语言unsigned char类型的数据应该用什么格式说明符输出

[复制链接]
跳转到指定楼层
楼主
ID:452950 发表于 2020-4-3 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以十进制输出一个数组中的数unsigned int a[6]={11,22,33,44,55,66};
可以用
printf("%d%d",a[0],a[1]);
或者
printf("%u%u",a[0],a[1]);
请问unsigned char a[6]={1,2,3,4,5,6};应该用什么格式说明符输出,
在网上看到有人说用%c, %x, %u,但是仍然会碰到一些问题。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2020-4-4 01:25 | 只看该作者
%d、%f、%s、%c %x分别是输出整数、实数、字符串和字符 十六制数的控制符,同样一个数,输出格式不同,则结果不同
回复

使用道具 举报

板凳
ID:282850 发表于 2020-4-4 09:28 | 只看该作者
  友情提醒,printf是谭xx的C语言教程中最臭名招著的,不学最好。网上程序代码我一看到有printf的基本就不看。在潜入式系统它是无用的。
回复

使用道具 举报

地板
ID:452950 发表于 2020-4-4 09:34 | 只看该作者
csmyldl 发表于 2020-4-4 01:25
%d、%f、%s、%c %x分别是输出整数、实数、字符串和字符 十六制数的控制符,同样一个数,输出格式不同,则结果 ...

但是%d是输出signed int类型的十进制数,用来输出char类型的数组中的一个元素,会把后面一位也读出来。
回复

使用道具 举报

5#
ID:452950 发表于 2020-4-4 09:47 | 只看该作者
f556 发表于 2020-4-4 09:28
友情提醒,printf是谭xx的C语言教程中最臭名招著的,不学最好。网上程序代码我一看到有printf的基本就不 ...

我是想通过蓝牙串口导出单片机考勤器存储的考勤记录,觉得用printf和puts比较方便控制换行和排列数据,请问有其他好的方法吗
回复

使用道具 举报

6#
ID:282850 发表于 2020-4-4 10:28 | 只看该作者
xxpp2011 发表于 2020-4-4 09:34
但是%d是输出signed int类型的十进制数,用来输出char类型的数组中的一个元素,会把后面一位也读出来。

嵌入式系统,如单片机程序中printf基本就没有使用的,试过为了调试用printf将数组发到即时窗口观查,无用。没有即时性,却增加了700Byte多。
处理数据一般还是依靠C的基本语句,很方便。
恶心printf的另一原因,谭的 ,a= b+a; printf( ); 结果:xxx 。这种无聊的写法,直接说明结果就行了。
前几天用strcat()连接多个字符,送LCD12864显示,总是莫名其妙出问题。而且编译后字节数增加694Byte。
直接用 TM[7]=RTCSEC &0x0f+'0';爽了多倍,还保证不出错。 我用过的MSP430F2001是128Bram,1KBFalsh。
回复

使用道具 举报

7#
ID:452950 发表于 2020-4-4 19:02 | 只看该作者
f556 发表于 2020-4-4 10:28
嵌入式系统,如单片机程序中printf基本就没有使用的,试过为了调试用printf将数组发到即时窗口观查,无用 ...

我的水平还不够,需要继续学习
回复

使用道具 举报

8#
ID:546770 发表于 2020-4-4 21:02 | 只看该作者
这个怎么说呢,不同的格式自然会输出不同的信息,说白了就是这个字节的数据,你想看16进制数输出的时候无非就是机器帮你转换了而已。
回复

使用道具 举报

9#
ID:452950 发表于 2020-4-4 23:05 | 只看该作者
小黑屋525 发表于 2020-4-4 21:02
这个怎么说呢,不同的格式自然会输出不同的信息,说白了就是这个字节的数据,你想看16进制数输出的时候无非 ...

我知道不同进制怎么输出,问题是如何按十进制输出长度为1字节的数据
按十进制输出int类型变量可以用%d,按十进制输出char类型变量没办法用%d,它会以给出的地址连续输出两个字节,如果是char类型的数组就会一次读出两个元素。而只输出一个字符的%c却会将数据转化为ASCII码,且只能解决0+256x~127+256x的数。
现在找不到好的办法,要么将要显示的数据都定义为int,要么只能不用printf函数了。


回复

使用道具 举报

10#
ID:452950 发表于 2020-4-4 23:25 | 只看该作者
比方说       
int a,b;
a=ReadByte(Address1);b=ReadByte(Address2);
printf("%d月%d日\n",a,b);            //读日期
j结果是4月3日,结果正常

printf("%d月%d日\n",ReadByte(Address1+6),ReadByte(Address1+5));//读日期
结果是1027月17日
原因是我把签到日期年月日时分秒作为char类型数组存在AT24C256的6个地址(AT24C256按字节读取一个地址可存1字节数据)
所以用%d按十进制输出char类型和uchar数据是有问题的,我试过%c,%i,%u,%hu,%hhu都不行
回复

使用道具 举报

11#
ID:454000 发表于 2020-4-5 10:01 | 只看该作者
你为什么不定义成unsigned char a[6]={'1','2','3','4','5','6'};你这分明是没有匹配好,后面改输出也没用
回复

使用道具 举报

12#
ID:546770 发表于 2020-4-5 14:15 | 只看该作者
xxpp2011 发表于 2020-4-4 23:25
比方说       
int a,b;
a=ReadByte(Address1);b=ReadByte(Address2);

这个我就没怎么想过了,串口确实是输出ASC码的,我之前用的是将每一位分别取出,转换成ASC码,放进一个数组,再将这个数组统一发送出来,要不你试试这样子行不行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表