字符串超出范围
String subscipt out of range
我的代码在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 后,它就会递减。但是你的j
是unsigned
的,所以不是变得-1
(并在下一次迭代时退出循环),j
变得4158584613
,循环继续,试图访问索引4158584613
处明显脱离键的元素在以下行:
(*current)[j] = 0;
i
、j
和length
签名将解决您的问题。
我将其加载到本地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;
}
谢谢尼拉吉·拉蒂
相关文章:
- C++ - 使用基于范围的 for 循环将字符值分配给向量中的字符串不会分配值
- 字符串的矢量并使用 C++20 范围进行转换
- C++ - 成功打印超出范围的字符串索引
- C++十进制到十六进制(字符串下标超出范围)
- 如何修复范围内的字符串声明错误
- C++ 字符串订阅超出范围的问题
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 初始检查以查看子字符串是否在范围内
- 在此范围C 中未声明字符串和char变量
- 尝试对字符串[数组]>>cin 并出现错误(" "字符串下标超出范围")
- 如何在 C++ 的字符串中打印从一个索引到另一个索引的字符范围
- C++:,当我使用字符串数组时,它的字符串下标超出了范围
- 如何将标准::字符串拆分为标准::string_views的范围 (v3)
- 为带有带前缀的字符串的容器查找相等的范围
- 为什么程序显示字符串超出范围
- 字符串订阅超出范围 - 字符串气泡排序
- 使用std :: quare_range查找字符串向量中发生的前缀范围
- 范围基于循环,使用指示字符串的指针
- 为什么在范围中未声明此字符串
- 用于匹配 C++ 范围字符串文本的正则表达式 (L "..." )