硬汉嵌入式论坛

 找回密码
 立即注册
查看: 669|回复: 6
收起左侧

[技术讨论] 【C算法请教】MDK 环境下怎么实现复制指定字符转换整数或者小数

[复制链接]

12

主题

22

回帖

58

积分

初级会员

积分
58
发表于 2022-12-6 07:30:37 | 显示全部楼层 |阅读模式
本帖最后由 951319804 于 2022-12-6 07:33 编辑

目的:在C环境下,实现像Delphi Copy函数功能。Delphi Copy函数是什么?
举个例子:str:="123456";str1:=Copy(Str,2,3);结果str1等于234.
Copy有3个参数,第一个是你要处理的字符串,第二个是你要截取的开始位置,第3个是截取位数。当你的第3个参数大于字符长度,那么效果就是取开始位置后的所有字节。
str1:=Copy(Str,2,10);结果就是str1等于23456.
以上是关于Delphi Copy函数说明。
那么为什么我要在C下面实现呢?理由:我像截取存有Ascii码的数组,进行截取有数字使用atoi和atof函数转换(此处在另外一个贴子里面,硬汉哥告诉的我。)
上位机发送:MON?[CR](4D 4F 4E 3F 0D)
下位机数据转换成字符:00000,00000,50,50,000000,00000,0
下位机返回:30 30 30 30 30 2C 35 30 2C 35 30 2C 30 30 30 30 30 30 2C 30 30 30 30 30 2C 31 0D
需要对下位机返回数据进行截取之后,分开转整数,小数,负数处理。
USER_UART2_AsciiCode_VARS Uart2_AsciiCode__Analysis(INT8U *AsciiCode,INT8U pos,INT8U AsciiCode_Length)
{
    INT8U i,j,sp,ep,dest[10]={0};
          AsciiCode_ReturnStruct  AsciiCode_Return_Struct;
        if (pos < 1 )pos=1;
        j=0;
        for (i=0;i<AsciiCode_Length;i++)
          if (j==0)
                {
                   if ((AsciiCode >= '0')&& (AsciiCode >= '9')|| (AsciiCode >= '+')|| (AsciiCode >= '-'))
                         {
                            sp=i;
                                  j=1;
                         }
                       else
                        if(AsciiCode == ',' )                         
                                 sp=i;
                           ep=i;
                            j=3;
                }
                else
                        if (j==1)
                        {
                          if ((AsciiCode < '0')||(AsciiCode > '9'))
                                {
                                  ep=i;
                                        j=2;
                                }
                        }
                if (j==2)
                {
                  AsciiCode_Return_Struct.Index=ep+1;
                         
                AsciiCode_Return_Struct.Value =atoi(Copy(AsciiCode,sp,ep-sp));     //如果C里面有Delphi的Copy函数,处理起来很简单了。  
                                   
               
                }
}





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2022-12-6 10:10:12 | 显示全部楼层
可以考虑使用strncpy,自己手动写起始地址直接给函数源缓存。

char *strncpy(char *dest, const char *src, int n)
回复

使用道具 举报

19

主题

235

回帖

292

积分

高级会员

积分
292
发表于 2022-12-6 10:34:15 | 显示全部楼层
在你上一个帖子中回了,用 strtok_r 可以把 00000,00000,50,50,000000,00000,0 中以逗号分割的内容提取出来
然后你再根据对应位置的格式使用 sscanf 进行字符串到数的转换
回复

使用道具 举报

12

主题

22

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2022-12-6 11:50:39 来自手机 | 显示全部楼层
谢谢,大家回答,但是,返回的是Ascii码,需要将串口返回的Ascii码转换成字符之后,再使用strtok_r是吧
回复

使用道具 举报

12

主题

22

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2022-12-6 12:13:02 来自手机 | 显示全部楼层
eric2013 发表于 2022-12-6 10:10
可以考虑使用strncpy,自己手动写起始地址直接给函数源缓存。

char *strncpy(char *dest, const char *s ...

谢谢,就是写存放字符变量地址给源缓存是吧。
回复

使用道具 举报

19

主题

235

回帖

292

积分

高级会员

积分
292
发表于 2022-12-6 13:38:12 | 显示全部楼层
下面上来的是哪种格式的
1. "30 30 30 30 30 2C 35 30 2C 35 30 2C 30 30 30 30 30 30 2C 30 30 30 30 30 2C 31 0D"
2. {0x30, 0x30, 0x30, 0x30, 0x30, 0x2C, 0x35, 0x30, 0x2C, 0x35, 0x30, 0x2C,0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x2C, 0x31, 0x0D}
是1的话要两个两个一组转换成2的形式,最好把末尾的0x0D回车换成0x00('\0'),这样就直接是个有效的字符串了,反正昂0x0D也只是个结束标志
然后strtok_r分割,sscanf转换
虽然说可能效率不算高,但总算是一种办法吧
回复

使用道具 举报

12

主题

22

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2022-12-6 16:54:11 | 显示全部楼层
tovinz 发表于 2022-12-6 13:38
下面上来的是哪种格式的
1. "30 30 30 30 30 2C 35 30 2C 35 30 2C 30 30 30 30 30 30 2C 30 30 30 30 30  ...

好的,谢谢,我试试
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 21:21 , Processed in 0.176066 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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