【问题标题】:C++ Escape Phrase SubstringC++ 转义短语子字符串
【发布时间】:2012-08-10 18:45:34
【问题描述】:

我正在尝试解析来自服务器的网络数据,并且我正在尝试找到我所拥有的更多 stl 版本。

我的旧代码包含一个 for() 循环,并根据一组转义字符检查字符串的每个字符,并使用 stringstream 来收集其余部分。我相信你可以想象,这种循环会导致读取 Web 数据时出现故障,因为我需要严格的语法检查。

我正在尝试改用 string::find 和 string::substr 函数,但我不确定最好的实现方式。

基本上,我想从服务器读取一串数据,不同的数据,用逗号分隔。 (即,first,lastname,email@email.com)并用逗号分隔,但读取其间的数据。

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

【问题讨论】:

  • 你应该研究正则表达式——它们会让你定义一套好的规则来检索特定的模式。
  • Boost 库有一些非常漂亮的东西,比如boost::splitboost::regex,你可能会觉得有用。一些编译器也支持新的 C++11 std::regex 等。如果您正在处理 XML soap 请求和响应,也许 TinyXML 或其他 XML 解析器可能会提供帮助。

标签: c++ string parsing stl web


【解决方案1】:

我不确定您要解析哪种数据,但使用多层架构总是一个好主意。每一层都应该实现一个抽象函数,每一层应该只做一项工作(比如转义字符)。

您使用的层数取决于解码流所需的实际步骤

对于您的问题,我建议以下几层:

第一个:用','和'\n'标记:转换成某种字符串向量

第二个:解决转义:解码转义字符

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

【讨论】:

  • 这就是我现在的做法。我正在使用 strtok_s(VC++ 版本)将数据转换为地图。我检查命中的转义字符数作为第一级语法检查。然后,我将解析后的数据传递给更高级别的函数来解释和使用它。
【解决方案2】:

为了学习体验,这是我最终用来将数据解析为地图的代码。您可以使用 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;
}

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多