标题: C语言unsigned char类型的数据应该用什么格式说明符输出 [打印本页]

作者: xxpp2011    时间: 2020-4-3 22:46
标题: C语言unsigned char类型的数据应该用什么格式说明符输出
以十进制输出一个数组中的数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,但是仍然会碰到一些问题。



作者: csmyldl    时间: 2020-4-4 01:25
%d、%f、%s、%c %x分别是输出整数、实数、字符串和字符 十六制数的控制符,同样一个数,输出格式不同,则结果不同
作者: f556    时间: 2020-4-4 09:28
  友情提醒,printf是谭xx的C语言教程中最臭名招著的,不学最好。网上程序代码我一看到有printf的基本就不看。在潜入式系统它是无用的。
作者: xxpp2011    时间: 2020-4-4 09:34
csmyldl 发表于 2020-4-4 01:25
%d、%f、%s、%c %x分别是输出整数、实数、字符串和字符 十六制数的控制符,同样一个数,输出格式不同,则结果 ...

但是%d是输出signed int类型的十进制数,用来输出char类型的数组中的一个元素,会把后面一位也读出来。
作者: xxpp2011    时间: 2020-4-4 09:47
f556 发表于 2020-4-4 09:28
友情提醒,printf是谭xx的C语言教程中最臭名招著的,不学最好。网上程序代码我一看到有printf的基本就不 ...

我是想通过蓝牙串口导出单片机考勤器存储的考勤记录,觉得用printf和puts比较方便控制换行和排列数据,请问有其他好的方法吗
作者: f556    时间: 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。
作者: xxpp2011    时间: 2020-4-4 19:02
f556 发表于 2020-4-4 10:28
嵌入式系统,如单片机程序中printf基本就没有使用的,试过为了调试用printf将数组发到即时窗口观查,无用 ...

我的水平还不够,需要继续学习
作者: 小黑屋525    时间: 2020-4-4 21:02
这个怎么说呢,不同的格式自然会输出不同的信息,说白了就是这个字节的数据,你想看16进制数输出的时候无非就是机器帮你转换了而已。
作者: xxpp2011    时间: 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函数了。



作者: xxpp2011    时间: 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都不行

作者: shuisheng    时间: 2020-4-5 10:01
你为什么不定义成unsigned char a[6]={'1','2','3','4','5','6'};你这分明是没有匹配好,后面改输出也没用
作者: 小黑屋525    时间: 2020-4-5 14:15
xxpp2011 发表于 2020-4-4 23:25
比方说       
int a,b;
a=ReadByte(Address1);b=ReadByte(Address2);

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1