字符串超出范围

String subscipt out of range

本文关键字:范围 字符串      更新时间:2023-10-16

我的代码在MS VS 2012中编译后,按预期接受输入,然后崩溃并显示以下报告:

Debug Assertion Failed!
...includexstring
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]='';
    return &(string1[result_index]);
}
int main()
{
    readNumberSubstrings();
    cout << getMaxSubstring() << endl;
    return 0;
}

我想一定是一些非常简单的事情(比如一些循环条件或类似的东西)导致它崩溃,但我没有看到它。

您的问题在于使用 unsigned int .请看这一行:

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

在这里,j 变为 0 后,它就会递减。但是你的junsigned的,所以不是变得-1(并在下一次迭代时退出循环),j变得4158584613,循环继续,试图访问索引4158584613处明显脱离键的元素在以下行:

(*current)[j] = 0;

ijlength签名将解决您的问题。

我将其加载到本地Visual Studio 2008上的测试解决方案中,并在i和j中将无符号int替换为int,然后它运行

#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]='';
    return &(string1[result_index]);
}
int main()
{
    readNumberSubstrings();
    cout << getMaxSubstring() << endl;
    return 0;
}

谢谢尼拉吉·拉蒂