太久没写C++了,发觉实在有点...关于字符串解析(分数不是问题)

nonocast 2007-09-19 08:36:13
USER: nonocast
PWD: 123456
CMD:
aaaaa
bbbbb
ccccc


上面就是一个协议格式
现在我想解析成一个hash
buffer -> std::map<string, string>

怎么写?
谢谢了

限制条件
1.Target: i486-linux-gnu
gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)
2.需要移植到mips上,boost估计用不了

-------------------------------
在C++版问了下,好像没什么人气,还是放到这吧,谢谢了

...全文
1076 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkread 2007-09-21
  • 打赏
  • 举报
回复
好的函数是没有错误处理的
dyw 2007-09-20
  • 打赏
  • 举报
回复
到这里看看“可读性”:
http://blog.csdn.net/dyw/archive/2007/09/20/1792153.aspx
dyw 2007-09-20
  • 打赏
  • 举报
回复
呵呵,不会生气。这么简明......无奈......
自己排一下版,很容易懂的。逆向搜索。
qeq2008 2007-09-20
  • 打赏
  • 举报
回复
向星哥学习
nonocast 2007-09-20
  • 打赏
  • 举报
回复
呵呵,不要生气,哈哈
nonocast 2007-09-20
  • 打赏
  • 举报
回复
可读性....是个问题,我不得不说
dyw 2007-09-20
  • 打赏
  • 举报
回复
可能偶这个版本费用是最低的。
字段个数不限,字段值所含字符不限
dyw 2007-09-20
  • 打赏
  • 举报
回复
偶也提供一个版本,倒过来找。

#include <stdio.h>

char string[] = "USER: nonocast\nPWD: 123456\nCMD:\naaaaa\nbbbbb\ncccccc\n";

int main( void )
{
char *p = string + strlen(string);
char* pKey = NULL;
char* pVal = NULL;
while (p >= string)
{
if (*p == ':')
{
pVal = p+1;
*p = '\0';
}
else if (*p == '\n' && pVal)
{
pKey = p+1;
*p = '\0';
if (pVal && pKey)
{
printf("%s : %s\n", pKey, pVal);
}
// clear pKey&pVal to make a Next Find
pKey = NULL;
pVal = NULL;
}

--p;
}
// the last pair
pKey = p+1;
// pKey = string;
printf("%s : %s\n", pKey, pVal);
}
nonocast 2007-09-20
  • 打赏
  • 举报
回复
从这里开始,然后Java,csharp,ruby
最后还是回到原点
用VIM写C++
刚刚开始,现在需要在C++/ruby/csharp中切换

VIM是个好同志,呵呵
想到一首歌


曾经真的以为人生就这样了
平静的心拒绝再有浪潮
斩了千次的情丝却断不了
百转千折它将我围绕
有人问我你究竟是哪里好
这么多年我还忘不了
春风再美也比不上你的笑
没见过你的人不会明了

i am back.
nonocast 2007-09-20
  • 打赏
  • 举报
回复
zhaozongtailingling这个不错
没想到这个还把masterz请出来了,真是太久没看到了
有点感觉了
  • 打赏
  • 举报
回复
用string:
char szBuf[128] = {0};
strcpy(szBuf, "USER: nonocast\nPWD: 123456\nCMD:\naaaaa\nbbbbb\ncccccc\n");
string str=szBuf;

string strKey,strValue;
map<string,string> mapCommand;
string::size_type iPos=str.find(":")
if(iPos!=string::npos){
strKey=str.substr(0,iPos);
str=str.substr(iPos+1,str.length()-iPos);
.....
.....

}

用循环就可以分解出来

JohnWoo 2007-09-20
  • 打赏
  • 举报
回复
哈哈.....

更喜欢masterz的实现方法。
Cowboy22 2007-09-20
  • 打赏
  • 举报
回复
那就用结构吧,这个最简单了:
struct XXX{
char USER[XXX];
char PWD[XXX];
char CMD[XXX];
};
但要字节对齐最好是pack 1。
得到数据后,强制转成struct XXX。
xml解析效率低。
dyw 2007-09-20
  • 打赏
  • 举报
回复
expat
nonocast 2007-09-20
  • 打赏
  • 举报
回复
我很多服务都是建立在REST上的
如果能找到相对比较高效的xml解析是一个非常好的事情
我是担心效率,性能才考虑定这么一个协议的
nonocast 2007-09-20
  • 打赏
  • 举报
回复
有没有很小巧的XML解析器?
不知道效率如何...
其实xml是正道,呵呵
蒋晟 2007-09-20
  • 打赏
  • 举报
回复
用XML/SOAP吧
nonocast 2007-09-20
  • 打赏
  • 举报
回复
是不是协议本身不够好,呵呵
USER: xxx
PWD: xxx
CMD:
<tab>xxx
<tab>xxx
ANOTHER:
<tab>xxx
<tab>xxx
<tab>xxxxxxx

这样会好些吗?
pass86 2007-09-20
  • 打赏
  • 举报
回复
正则表达式?是否?
dyw 2007-09-20
  • 打赏
  • 举报
回复
也没有问题。
判断原理:'\n'与':' 之间的是Key,其他的是Val。(第一个缺少开头的'\n',例外)
加载更多回复(21)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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