首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在此字符串操作代码中获取out_of_range错误

在此字符串操作代码中获取out_of_range错误
EN

Stack Overflow用户
提问于 2012-06-20 04:56:53
回答 3查看 122关注 0票数 0

嗨,我在下面的代码中点击std::out_of_range: basic_string::substr。一直在努力想办法解决问题,但却做不到。

代码语言:javascript
运行
复制
std::string orig_str = "1-1,2-3,4-4,56-75,77-77";
size_t number_digits;
for (size_t i = 0; i < orig_str.size(); ++i)
{
    number_digits = orig_str.find_first_of(",", i) - i - 1;
    if(orig_str.find("-", i) != std::string::npos)
    if (orig_str.substr(i - number_digits, i - 1) == orig_str.substr(i + 1, i + number_digits))
    orig_str.erase(i-number_digits, number_digits + 1);            
}

基本上,这段代码正在操作字符串以删除某些范围,预期的行为是:输入字符串: "0-0,2-7,88-88“输出字符串: "0,2-7,88”

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-20 06:13:44

AJ,这是我们在聊天中讨论的伪代码:

代码语言:javascript
运行
复制
input_string = "1-1,2-3,4-4,56-75,77-77"
output_string = ""
while (input_string is not empty)
    sub = input_string.substr(up to first comma)
    input_string = input_string.substr(after first comma)
    if (sub.substr(up to dash) == sub.substr(after dash))
        output_string += sub.substr(up to dash)
    else
        output_string += sub
    if (input_string is not empty)
        output_string += ","
票数 1
EN

Stack Overflow用户

发布于 2012-06-20 06:02:15

您将遍历原始字符串的长度,并对其进行修改并在此更改长度。编译器可能优化对orig_str.size()的调用,这意味着它将获取一次长度,并允许您迭代字符串的新长度。

您可能应该更改以保持orig_str从一开始就保持不变(否则它的命名非常糟糕),并将结果放入一个新的字符串中。

票数 0
EN

Stack Overflow用户

发布于 2012-06-20 06:43:25

代码语言:javascript
运行
复制
    int flag = 0;
    int num_ch;
    char * fnum = NULL, * snum = NULL;
    int numOfLoop = orig_str.size();
    for(int i = 0; i < numOfLoop; i++)
    {
        if(orig_str[i] == '-')
        {
            flag = 1;
        }
        else if(orig_str[i] == ',')
        {
            int ret = strcmp(fnum, snum);
            if(ret == 0)
            {
                int sizeOfNUM = strlen(fnum);
                int numOfChToReplace = sizeOfNUM + sizeOfNUM + 1;
                orig_str.replace(i - numOfChToReplace,numOfChToReplace, fnum); 
                numOfLoop = numOfLoop - (sizeOfNUM + 1);
                i = i - (sizeOfNUM + 1);
            }

            flag = 0;
            delete [] fnum;
            delete [] snum;
            fnum = NULL;
            snum = NULL;
        }
        else
        {
            if(flag == 1)
            {
                if(snum == NULL)
                {
                    snum = new char[2];
                    snum[0] = orig_str[i];
                    snum[1] = '\0';
                }
                else
                {
                    int size = strlen(snum);
                    char * tmp = snum;
                    snum = new char[size + 2];
                    for( int j = 0; j < size; j++)
                        snum[j] = tmp[j];
                    snum[size] = orig_str[i];
                    snum[size + 1] = '\0';
                }
            }
            else 
            {
                if(fnum == NULL)
                {
                    fnum = new char[2];
                    fnum[0] = orig_str[i];
                    fnum[1] = '\0';
                }
                else
                {
                    int size = strlen(fnum);
                    char * tmp = fnum;
                    fnum = new char[size + 2];
                    for( int j = 0; j < size; j++)
                        fnum[j] = tmp[j];
                    fnum[size] = orig_str[i];
                    fnum[size + 1] = '\0';
                }
            }
        }
    }

    int ret = strcmp(fnum, snum);
    if(ret == 0)
    {
        int sizeOfNUM = strlen(fnum);
        int numOfChToReplace = sizeOfNUM + sizeOfNUM + 1;
        orig_str.replace(i - numOfChToReplace,numOfChToReplace, fnum); 
        numOfLoop = numOfLoop - (sizeOfNUM + 1);
        i = i - (sizeOfNUM + 1);
    }

    flag = 0;
    delete [] fnum;
    delete [] snum;
    fnum = NULL;
    snum = NULL;

    std::cout << orig_str.c_str() << std::endl;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11113050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档