【问题标题】:Function for efficient parsing of multiple numbers with delimiter in C++在 C++ 中使用分隔符有效解析多个数字的函数
【发布时间】:2013-02-10 17:41:57
【问题描述】:

下面的这个函数简单地接受一个用64位整数填充的字符串,每个值用分隔符分隔,将放入向量中。

vector<unsigned long long int> getAllNumbersInString(string line, char delim){
    vector<unsigned long long int> v;

    string word;
    stringstream stream(line);
    unsigned long long int num;

    while(getline(stream, word, delim))
        num = atol(word.c_str());
        v.push_back(num);
    }

    return v;
}

这个函数可以很好地工作,例如,我们有','作为分隔符,但是,如果字符串变量“line”中的数据是这样的,分隔符将失败:

     432   12332    2234   12399   

虽然数据似乎使用空格作为分隔符,但使用上面的代码,整个代码将在逻辑上失败。例如,空白之间的空白是未定义的,atol 将返回 0,并将这些 0 放入向量中。

为了更好地防范这些异常,我应该在这段代码中采取哪些措施?

【问题讨论】:

  • 也许stream &gt;&gt; num 就足够了?

标签: c++ string error-handling delimiter


【解决方案1】:

有什么原因你不能/不会只使用这样的东西吗?:

while (stream >> num)
   v.push_back(num);

或者只是:

vector<unsigned long long int> getAllNumbersInString(string line) { 
    istringstream stream(line);  
    typedef unsigned long long int T;

    vector<T> v((istream_iterator<T>(stream)), istream_iterator<T>());
    return v;
}

如果您必须处理除空格以外的分隔符,您可以创建一个 ctype facet 来指定应将哪些其他内容视为分隔符。

【讨论】:

  • 我明白了。所以我们也可以这样做。听起来我现在需要彻底审查 C++。我学习高级语言太久了……
【解决方案2】:

您可以让 iostreams 库为您处理空白:

unsigned long long int num;
while(stream >> num)
    v.push_back(num);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2015-03-09
    相关资源
    最近更新 更多