2012-08-10 75 views
1

我想解析来自服务器的网络数据,并且我试图找到我所拥有的更多stl版本。C++转义短语子字符串

我的旧代码由for()循环组成,并检查字符串的每个字符与一组转义字符,并使用stringstream收集其余字符。正如我可以想象的那样,这种循环在读取Web数据时导致高级失败,因为我需要严格的语法检查。

我想改为开始使用字符串::查找和字符串:: substr函数,但我不确定最好的实现。

基本上,我想从服务器读取一串数据,不同的数据,用逗号分隔。 (即首先姓氏,电子邮件@ email.com),然后用逗号分隔它,但读取它们之间的数据。

任何人都可以提供任何建议吗?

+1

你应该看看正则表达式 - 他们会让你定义一套好的规则来检索特定的模式。 – Pyrce 2012-08-10 18:49:47

+1

Boost库有一些非常漂亮的东西,比如'boost :: split'和'boost :: regex',你可能会觉得很有用。一些编译器也支持新的C++ 11'std :: regex'等。如果您正在处理XML soap请求和响应,则TinyXML或其他XML解析器可能会帮助您。 – AJG85 2012-08-10 19:30:27

回答

0

我不确定你解析哪种数据,但使用多层体系结构总是一个好主意。每个图层都应该实现一个抽象函数,并且每个图层只应该执行一项工作(如转义字符)。

您使用的层数取决于到流

你的问题,我建议以下层解码所需的实际步骤:

1:令牌化的“”和‘\ n’的转换成某种字符串

第二的载体:解决逃跑:解码逃生characers

你应该使用std :: stringstream的,并用循环处理的字符。除非你的格式非常简单(就像只有一个分隔符,没有转义符),你不能真的使用任何标准函数。

+0

这是我现在做的更多。我正在使用strtok_s(VC++版本)将数据转换为地图。我检查转义字符的数量作为第一级语法检查。然后,我将解析的数据传递给更高级别的函数来解释和使用它。 – 2012-08-11 05:44:04

0

对于学习体验,这是我最终用来解析数据到地图中的代码。您可以使用web_parse_resurn.err查看是否有错误,或将其用于特定的错误代码。

struct web_parse_return { 
map<int,string> parsedata; 
int err; 
}; 

web_parse_return* parsewebstring(char* escapechar, char* input, int tokenminimum) {     
int err = 0; 
map<int,string> datamap; 
if(input == "MISSING_INFO") { //a server-side string for data left out in the call 
    err++; 
} 
else { 
    char* nTOKEN; 
    char* TOKEN = strtok_s(input, escapechar,&nTOKEN); 
    if(TOKEN != 0) { //if the escape character is found 
     int tokencount = 0; 
     while(TOKEN != 0) {//since it finds the next occurrence, keep going 
      datamap.insert(pair<int,string>(tokencount,TOKEN)); 
      TOKEN = strtok_s(NULL, escapechar,&nTOKEN); 
      tokencount++; 
     } 
     if(tokencount < tokenminimum) //check that the right number was hit 
      err++; //other wise, up the error count 
    } 
    else { 
     err++; 
    } 
} 

web_parse_return* p = new web_parse_return; //initializing a new struct 
p->err = err; 
p->parsedata = datamap; 
return p; 
}