【问题标题】:How do I convert a range of integers into a list using C++如何使用 C++ 将整数范围转换为列表
【发布时间】:2010-04-19 14:20:40
【问题描述】:

我有一个格式为 1,3-7,10,11-15 的字符串输入 我想识别范围内输入的所有整数。如何使用 C++ 实现这一点?

TIA 孔雀鱼

【问题讨论】:

  • 到目前为止您尝试过什么?这样做的哪一部分让您感到困惑?这是作业吗?如果您提供更多信息,您将获得更多/更好的答案。

标签: c++


【解决方案1】:

这个问题属于解析领域。你会使用解析器。解析器解释一种语言。在您的情况下,语言将如下所示:

input = comma-separated sequence of fragments
fragment = integer or range
range = integer-integer
integer = sequence of digits 0..9

【讨论】:

    【解决方案2】:
    //Disclaimer -- untested
    //Disclaimer -- this is not good code, but it's a quick and dirty way to do this
    //              if you're trying to see a possible solution.
    
    #include <algorithm>
    #include <functional>
    #include <vector>
    
    const char input[] = "1,3-7,10,11-15";
    const char * inputBegin = input;
    const char * inputEnd = input + strlen(input);
    std::vector<int> result;
    for(; inputBegin < inputEnd; inputBegin = std::find_if(inputBegin, inputEnd, isdigit)) {
        int first = *inputBegin - '0';
        for(inputBegin++; inputBegin < inputEnd && isdigit(*inputBegin); inputBegin++)
            first = first * 10 + (*inputBegin - '0');
        int last = first;
        if (++inputBegin < inputEnd && *inputBegin == '-') {
            last = inputBegin - '0';
            for(inputBegin++; inputBegin < inputEnd && isdigit(*inputBegin); inputBegin++)
                last = last * 10 + (*inputBegin - '0');
        }
        for(; first < last; first++)
            result.push_back(first);
    }
    

    【讨论】:

    • +1 对于任何公开承认虽然它有效但不是最佳解决方案的人。希望更多人在他们的博客上这样做。
    • 这段代码很吓人。真恶心,真的。但我不会出于同样的原因对你投反对票。
    • 由于缺少空白和平静的绿色 cmets,它看起来比实际更可怕。
    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 2017-10-02
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多