字符串处理有什么好算法?

lurenyi 2007-04-23 09:37:44
从串口读取字符串,如何能从中提取数值?
字符串格式:
"SS:88\r\nAA:2.5E-5\r\nCC:Test\r\n";
串口定时发送定义好的格式串,每次读取数据时不一定总是按格式读到
比如可能读到以下的形式
"SS:88\r\nAA:2.5E-5\r\nCC:Test\r\nSS:89\r\nAA:3.5E-";
"88\r\nAA:2.5E-5\r\nCC:Test\r\nSS:89\r\nAA:3.5E-5\r\"
"2.5E-5\r\nCC:Test\r\nSS:89\r\nAA:3.5E-5\r\nCC:Test\r";
如何能够快速的从读到串里解出,88,2.5E-5,Test.
我现在是用AnsiString的Pos比较特定的串,"SS","AA:","CC"然后截取到字符串转换成所需要的数值.
想请教高手,有没有更优化的算法.
...全文
319 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
EagleFew 2007-04-28
  • 打赏
  • 举报
回复
必须进行协议的数据有效性进行检测,否则收到的数据都是错误的数据.

如果在确保能收到正确的数据前提下,
可以直接把收到的数据读取到TStringList中,因为有回车,所以在TStringList 中就是一行一行的保存的,每个三行就是你所需要的数据
jacknes009 2007-04-27
  • 打赏
  • 举报
回复
应该差不多把,主要看他AnsiString的Pos和sscanf 函数代码是怎么样写的,
过客猫2022 2007-04-27
  • 打赏
  • 举报
回复
可以用标准库是的stringstream类来读!
lurenyi 2007-04-24
  • 打赏
  • 举报
回复
谢谢各位朋友的帮助,我现在就使用这样的比较方法,我想问有什么更好的办法,能处理更快一些,
我想最好能够使用sscanf 函数直接从串里取得数据,但因为从串口数据每次读取的时候不知道是什么开头的,所以如何定义sscanf 函数的字符串格式就是个问题?
比如使用AnsiString的Pos比较特定的串,"SS","AA:","CC"然后截取一定的长度,调用不同参数的sscanf 函数获得数据.当还不知道这样的处理会不会快些
jacknes009 2007-04-24
  • 打赏
  • 举报
回复
正如Waiting4you(毛毛) 所说
从内容上看,它们是:
AA:内容1 回车
SS:内容2 回车
CC:内容3 回车
这种形式.
然后根据把内容数据送到自己函数中
调用
如内容1 = "2.5E-5";
double cc = strint("2.5E-5");
自己的函数
double strint(String str)
{
int pos = 0;
double result = 0;
pos = str.Pos("E");
if(pos == -1)
{
result = StrToFloat(str);
return result;
}
else
{
String temp = str.SubString(1,pos - 1);
str = str.SubString(pos + 1, str.Length() - pos);
if(str == "-")
{
result = StrToFloat(temp);
result = result / 10;
return result;
}
else
{
int num = StrToInt(str);
result = StrToFloat(temp);
while(num)
{
result = result / 10;
num = num + 1;
}
return result;
}
}
}
Waiting4you 2007-04-24
  • 打赏
  • 举报
回复
从内容上看,它们是:
AA:内容1 回车
SS:内容2 回车
CC:内容3 回车
这种形式.

so 一个好办法是从串口一个字节一字节读入到一个stringstream里, 遇到回车再处理里面的内容
如:
串口有数据时(一个字节一字节读):
ios<<ch;
if(ch=='\n')
{
ios>>str;
//根据str读出内容1,内容2或内容3, 用strtok()函数很方便
}


过客猫2022 2007-04-24
  • 打赏
  • 举报
回复
可以分隔成一行一行,然后再一行一行处理!
constantine 2007-04-23
  • 打赏
  • 举报
回复
如果协议可以自己定义还不如重新定义过
串口读可是不一定完成,有时候发一个东西会读几次的要看具体情况
Y___Y 2007-04-23
  • 打赏
  • 举报
回复
建议采用c中字符串数组的方式,自己编写相应的函数,可能好一点

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧