0

こんにちは私は次のコードでstd::out_of_range:basic_string::substr を押しています。それを修正するために一生懸命努力してきましたが、それを成し遂げることができません。

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"

4

3 に答える 3

1

AJ、これはチャットで説明した擬似コードです。

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 += ","
于 2012-06-20T06:13:44.640 に答える
0

元の文字列の長さを繰り返し処理し、それを変更して長さを変更します。コンパイラーは、呼び出しを最適化してorig_str.size()、長さを1回フェッチし、文字列の新しい長さよりも多く反復できるようにする場合があります。

おそらくorig_str、最初からそのままにして(そうでない場合は、名前が非常に悪い)、結果を新しい文字列に入れるように変更する必要があります。

于 2012-06-20T06:02:15.870 に答える
0
    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;
于 2012-06-20T06:43:25.190 に答える