Строковый подписчик вне диапазона

Мой код, после компиляции в MS VS 2012, принимает входные данные, как следует, и затем вылетает со следующим отчетом:

Debug Assertion Failed!
...\include\xstring
Line:1662
Expression:string subscript out of range

Код выглядит следующим образом:

#include "stdafx.h"#include <iostream>
#include <string>
#include <vector>
#include <cassert>
#include <time.h>using namespace std;const unsigned short MAX_STRINGS = 10;
const unsigned int  MAX_SIZE=10000;
vector<string> strings;
unsigned int len;

string GetLongestCommonSubstring( string string1, string string2 );
inline void readNumberSubstrings();
inline const string getMaxSubstring();

void readNumberSubstrings()
{
cin >> len;

assert(len > 1 && len <=MAX_STRINGS);

strings.resize(len);

for(unsigned int i=0; i<len;i++)
strings[i]=string(MAX_SIZE,0);

for(unsigned int i=0; i<len; i++)
cin>>strings[i];
}

const string getMaxSubstring()
{
string maxSubstring=strings[0];
long T=clock();
for(unsigned int i=1; i < len; i++)
maxSubstring=GetLongestCommonSubstring(maxSubstring, strings[i]);
cout << clock()-T << endl;
return maxSubstring;
}

string GetLongestCommonSubstring( string string1, string string2 )
{

const int solution_size = string2.length()+ 1;

int *x=new int[solution_size]();
int *y= new int[solution_size]();

int **previous = &x;
int **current = &y;

unsigned int max_length = 0;
unsigned int result_index = 0;

unsigned int j;
unsigned int length;
int J=string2.length() - 1;

for(unsigned int i = string1.length() - 1; i >= 0; i--)
{
for(j = J; j >= 0; j--)
{
if(string1[i] != string2[j])
(*current)[j] = 0;
else
{
length = 1 + (*previous)[j + 1];
if (length > max_length)
{
max_length = length;
result_index = i;
}

(*current)[j] = length;
}
}

swap(previous, current);
}
string1[max_length+result_index]='\0';
return &(string1[result_index]);
}

int main()
{
readNumberSubstrings();
cout << getMaxSubstring() << endl;
return 0;
}

Я предполагаю, что это должно быть что-то действительно простое (например, какое-либо условие цикла или что-то в этом роде), которое вызывает его сбой, но я не вижу этого.

1

Решение

Ваша проблема в использовании unsigned int, Посмотрите на эту строку:

for(j = J; j >= 0; j--)

Здесь после того, как j становится 0, оно уменьшается. Но твой j является unsignedпоэтому вместо того, чтобы становиться -1 (и выход из цикла на следующей итерации), j становится 4158584613и цикл продолжается, пытаясь получить доступ к элементу явно не связанных с индексом 4158584613 на этой линии:

(*current)[j] = 0;

Изготовление i, j, а также length подписано решит вашу проблему.

6

Другие решения

Я загрузил его в тестовое решение на моей локальной Visual Studio 2008 и заменил беззнаковое int на int в i и j, и он запустился

#include "stdafx.h"#include <iostream>
#include <string>
#include <vector>
#include <cassert>
#include <time.h>using namespace std;const unsigned short MAX_STRINGS = 10;
const unsigned int  MAX_SIZE=10000;
vector<string> strings;
unsigned int len;

string GetLongestCommonSubstring( string string1, string string2 );
inline void readNumberSubstrings();
inline const string getMaxSubstring();

void readNumberSubstrings()
{
cin >> len;

assert(len > 1 && len <=MAX_STRINGS);

strings.resize(len);

for(unsigned int i=0; i<len;i++)
strings[i]=string(MAX_SIZE,0);

for(unsigned int i=0; i<len; i++)
cin>>strings[i];
}

const string getMaxSubstring()
{
string maxSubstring=strings[0];
long T=clock();
for(unsigned int i=1; i < len; i++)
maxSubstring=GetLongestCommonSubstring(maxSubstring, strings[i]);
cout << clock()-T << endl;
return maxSubstring;
}

string GetLongestCommonSubstring( string string1, string string2 )
{

const int solution_size = string2.length()+ 1;

int *x=new int[solution_size]();
int *y= new int[solution_size]();

int **previous = &x;
int **current = &y;

unsigned int max_length = 0;
unsigned int result_index = 0;

int j;
unsigned int length;
int J=string2.length() - 1;

for(int i = string1.length() - 1; i >= 0; i--)
{
for(j = J; j >= 0; j--)
{
if(string1[i] != string2[j])
(*current)[j] = 0;
else
{
length = 1 + (*previous)[j + 1];
if (length > max_length)
{
max_length = length;
result_index = i;
}

(*current)[j] = length;
}
}

swap(previous, current);
}
string1[max_length+result_index]='\0';
return &(string1[result_index]);
}

int main()
{
readNumberSubstrings();
cout << getMaxSubstring() << endl;
return 0;
}

Спасибо
Нирадж Рати

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector