读书人

太久没写C++了发觉实在有点.关于字符

发布时间: 2012-03-29 12:53:12 作者: rapoo

太久没写C++了,发觉实在有点...关于字符串解析(分数不是问题)
USER: nonocast
PWD: 123456
CMD:
aaaaa
bbbbb
ccccc


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

C++怎么写?
谢谢了

Target: i486-linux-gnu
gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4)

[解决办法]
认真看了看,发现----不会。
[解决办法]
你这用法还是挺麻烦的,看起来\n还不能作为分隔符。否则的话,就解析不出CMD:后面的内容。

自己解析的话,可以简单的按 ': '作为token来分段,这时候数据分为下面几个部分:
USER
nonocast\nPWD
123456\nCMD
\naaaaa\nbbbbb\ncccccc\n

第一段依然是key,接下来的每一段从右边开始找 '\n ',如果找到了,则找到的位置后面部分是Key,前面是上一个Key的Value;如果找不到,则该段都是上个Key的Value。
[解决办法]
#include "iostream "
#include "string "
#include "map "

using namespace std;

char* find_prev_tok(const char* s, char* p) {

while (p > s)
if (*p-- == '\n ')
return p;
return 0;
}


int main(int argc, char *argv[])
{
char buffer[] = "USER: nonocast\nPWD: 123456\nCMD:\naaaaa\nbbbbb\ncccccc\n ";
char *p = buffer;

map <string, string> Map;

char* tok = strchr(p, ': ');

while (tok) {

char* su = strchr(++tok, ': ');
tok[-1] = 0;
if (su) {
char* ssu = find_prev_tok(tok, su);
if (ssu) {
*ssu++ = 0;
Map[p] = tok;
p = ssu;
}
else {
p = ++su;
}
}
else {
Map[p] = tok;
}


tok = strchr(p++, ': ');
}




return 0;
}


[解决办法]
strstr(line, "USER: ")
然后在这个\n之前的就是你的name
同理。。。。
存成map就直接赋值就行了

读书人网 >C++

热点推荐