[英]Getting out_of_range error in this string manipulation code
嗨,我在以下代碼中點擊了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”
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 += ","
您遍歷原始字符串的長度,並對其進行修改並由此更改長度。 編譯器可能會優化對orig_str.size()
的調用,這意味着它將一次獲取長度,並讓您迭代比字符串的新長度更多的長度。
您可能應該進行更改,以使orig_str
從一開始就保持orig_str
(否則,它的名稱將非常糟糕),然后將結果放入新的字符串中。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.