OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3004|回复: 3

求助结构体,输出错误,新手求助

[复制链接]

9

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2014-11-16
在线时间
32 小时
发表于 2020-9-24 08:49:35 | 显示全部楼层 |阅读模式
1金钱
typedef struct  
{                                                                                    
        u8 qn[17];       
        u8 st[2];
        u8 cn[4];
        u8 pw[6];
        u8 mn[24];
        u8 flag;
        //u16 cp;
//        u32 crc;
}hjcmd;


hjcmd hjtest;


void test(hjcmd *hjtest)
{
        int a,i;
        u8 x[17]="11111111111111111";
        u8 y[2]="22";
        u8 z[4]="3333";

        for(i=0;i<17;i++)
        {
                hjtest->qn[i]=x[i];
        }
        for(i=0;i<2;i++)
        {
                hjtest->st[i]=y[i];
        }
        for(i=0;i<4;i++)
        {
                hjtest->cn[i]=z[i];
        }
        printf("x=%s;y=%s;z=%s",hjtest->qn,hjtest->st,hjtest->cn);
}
输出中总是


错误

错误

最佳答案

查看完整内容[请看2#楼]

2楼3楼差不多说对了, 分析下是这样的 u8 x[17]="11111111111111111"; u8 y[2]="22"; u8 z[4]="3333"; 在这3个等式中,你赋值的都是字符串,字符串要以"\0"(实际ASCII就是0), 但是hjcmd hjtest;这个hjtest在系统运行时是被默认初始化为0的,全部是0,也就是全部是"\0". 所以,你在所有的for语句中,把部分数字改成了你要的字符串的对应的ASCII码,其余没改的是0,也就是"\0" 你的函数输出是从你指定的位置开始输出,直到他检测到AS ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2020-9-24 08:49:36 | 显示全部楼层
2楼3楼差不多说对了,
分析下是这样的
u8 x[17]="11111111111111111";
u8 y[2]="22";
u8 z[4]="3333";
在这3个等式中,你赋值的都是字符串,字符串要以"\0"(实际ASCII就是0),
但是hjcmd hjtest;这个hjtest在系统运行时是被默认初始化为0的,全部是0,也就是全部是"\0".
所以,你在所有的for语句中,把部分数字改成了你要的字符串的对应的ASCII码,其余没改的是0,也就是"\0"
你的函数输出是从你指定的位置开始输出,直到他检测到ASCII为0的位置为止.
是存储就是,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,0,0,0,0,0,0,0,0,0....
所以你要求从第一个输出时,他全部输出,直到0,你要求从2,2开始输出,他也是从这个位置开始,直到0,第三个也是
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8634
金钱
8634
注册时间
2020-5-11
在线时间
4082 小时
发表于 2020-9-24 10:15:00 | 显示全部楼层
字符串结尾要有个0才行,这个0也是需要存储空间的,x[17]只能装16个字符,y[2]只能装一个字符。
专治疑难杂症
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3875
金钱
3875
注册时间
2017-3-7
在线时间
1691 小时
发表于 2020-9-24 10:16:32 | 显示全部楼层
字符串是判断\0截止符,全局变量初始化为0,你赋值了一些,所以%s是会从起始地址开始输出,直到有\0(0)停止,所以出现你这个现象
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 21:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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