OpenEdv-开源电子网

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

使用sprintf和strlen遇到的问题

[复制链接]

11

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2018-3-19
在线时间
54 小时
发表于 2021-1-29 16:09:15 | 显示全部楼层 |阅读模式
今天又到一个问题,不知道是我基础不牢,还是哪里出bug了
下面是我的程序
char Buffer[100] = {0};
Buffer[0] = 'e';
Buffer[1] = 'm';
Buffer[2] =1;

sprintf(Buffer+6,"zhengdianyuanzi\r\n");
*((int *)(&Buffer[4])) =  strlen(Buffer) ;


串口观测  Buffer[4] =3
为什么没有把sprintf拼接的字符串长度计算在内。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2021-1-29 16:27:09 | 显示全部楼层
char Buffer[100] = {0};
Buffer[0] = 'e';
Buffer[1] = 'm';
Buffer[2] =1;  // 写1? 0x01?

sprintf(Buffer+6,"zhengdianyuanzi\r\n"); //数组+6?
*((int *)(&Buffer[4])) =  strlen(Buffer) ;

我就是打酱油的,说实话我没看懂你写的啥。不太理解功能。
我一般都这么写,不知道是不是你需要的:
char Buffer[100] = {0};
Buffer[0] = 'e';
Buffer[1] = 'm';
Buffer[2] =0x31;  //ASCII 1
sprintf(Buffer,"%szheng",Buffer);
Buffer[8]=strlen(Buffer)+0x30;
printf("%s",Buffer);
回复 支持 反对

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-29 16:27:10 | 显示全部楼层
1.你这个函数的方法用错了,根本没有实现拼接,要实现拼接可以用strncat函数哦
2.非要用sprintf的话,可以这样写sprintf(Buffer,"%s%s",zhengdianyuanzi\r\n");
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char buf1[20]="hello";
  5.         sprintf(buf1,"%s  %s",buf1,"world\r\n");
  6.         printf("%s",buf1);
  7. }
复制代码


像上面这个代码段,输出的就是
hello  world

可以先在C环境下编译试试
回复 支持 反对

使用道具 举报

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2021-1-29 16:31:44 | 显示全部楼层
本帖最后由 ma3264175 于 2021-1-29 16:50 编辑
asshole 发表于 2021-1-29 16:27
1.你这个函数的方法用错了,根本没有实现拼接,要实现拼接可以用strncat函数哦
2.非要用sprintf的话,可以 ...

老哥,发代码要严谨一些 另外,#include <string.h> 你没有添加
回复 支持 反对

使用道具 举报

11

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2018-3-19
在线时间
54 小时
 楼主| 发表于 2021-1-29 16:34:34 | 显示全部楼层

RE: 使用sprintf和strlen遇到的问题

谢谢你们帮我解决问题,我查了一下C语言,是我基础不牢。
strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。最终统计的字符串长度不包括\0。strlen() 在读到buffer[3]时停止了,计算了之前的三个数值
回复 支持 反对

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-29 16:34:46 | 显示全部楼层
ma3264175 发表于 2021-1-29 16:31
老哥,发代码要严谨一些 需要头文件 stdio.h

你要看严谨一点,我加了呀,你要是没看见,那就是系统不严谨了

而且我不是男的
回复 支持 反对

使用道具 举报

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2021-1-29 16:36:17 | 显示全部楼层
asshole 发表于 2021-1-29 16:34
你要看严谨一点,我加了呀,你要是没看见,那就是系统不严谨了

而且我不是男的

我看错了,不过sprintf(Buffer,"%s%s",zhengdianyuanzi\r\n");  肯定是报错的
回复 支持 反对

使用道具 举报

11

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2018-3-19
在线时间
54 小时
 楼主| 发表于 2021-1-29 16:37:47 | 显示全部楼层
asshole 发表于 2021-1-29 16:27
1.你这个函数的方法用错了,根本没有实现拼接,要实现拼接可以用strncat函数哦
2.非要用sprintf的话,可以 ...

谢了,我这个是别人的例子改过来的,是可以实现字符串拼接的。
回复 支持 反对

使用道具 举报

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2021-1-29 16:40:26 | 显示全部楼层
wqm123cccc 发表于 2021-1-29 16:34
谢谢你们帮我解决问题,我查了一下C语言,是我基础不牢。
strlen() 函数从字符串的开头位置依次向后计数, ...

我试了一下,你那个写法虽然不报错,但是 ,应该是拼接不上的。你可以用标准的写法。
回复 支持 反对

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-1-29 16:40:42 | 显示全部楼层
ma3264175 发表于 2021-1-29 16:36
我看错了,不过sprintf(Buffer,"%s%s",zhengdianyuanzi\r\n");  肯定是报错的

我要笑哭了,麻烦您看严谨一点

我直接从.c文件里面复制过来的,编译器用的gcc version 5.4.0 20160609
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 22:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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