C++;:终止调用';std::超出范围';what():basic_string::substr:_位置(即1)>;这->;size()(即0) 我有一个C++代码,我读的字符串只有a,c,g,t< /p>

C++;:终止调用';std::超出范围';what():basic_string::substr:_位置(即1)>;这->;size()(即0) 我有一个C++代码,我读的字符串只有a,c,g,t< /p>,c++,dns,C++,Dns,我试图找到最小的部分(K数),如果我转到字符串,每个部分都有四个字符(A,C,G,T) 当我运行代码并输入字符串时,会出现以下错误: 在抛出'std::out_of_range'的实例后调用terminate what():basic\u string::substr:\u pos(它是1)>this->size()(它是0) 这是我计算K的函数: int counter(string str) { int i = 3; int j = 0; bool good = false; while(

我试图找到最小的部分(K数),如果我转到字符串,每个部分都有四个字符(A,C,G,T)

当我运行代码并输入字符串时,会出现以下错误:

在抛出'std::out_of_range'的实例后调用terminate what():basic\u string::substr:\u pos(它是1)>this->size()(它是0)

这是我计算K的函数:

int counter(string str)
{
int i = 3;
int j = 0;
bool good = false;

while(i < (str.size() - 1) && !good){
    i++;
    while(j < (str.size() - i) && !good){
        string s = str.substr(j,i);
        good = (isin(s,'A') && isin(s,'C') && isin(s,'G') && isin(s,'T'));
        j++;
    }
}
if(i == str.size()){
    cout<<str.size()<<endl;
}
else{
    cout<<"Smallest section: "<<i<<"\n";
}
}
int计数器(字符串str)
{
int i=3;
int j=0;
bool good=false;
而(i<(str.size()-1)和&!good){
i++;
而(j<(str.size()-i)和&!良好){
字符串s=str.substr(j,i);
好=(isin(s,'A')&&isin(s,'C')&&isin(s,'G')&&isin(s,'T'));
j++;
}
}
如果(i==str.size()){
cout
str.size()
是一个无符号值,因此当
str.size()=0时,
str.size()-1
将被环绕并成为一个大值

您应该检查str.size()==0
,并在循环之前单独处理该案例

此外,还应该使用对字符串的引用作为参数,如

int counter(const string& str)
bool isin(const string& s,char x)

否则,将在每个函数调用时复制字符串,性能将降低。

错误:在
计数器
函数中使用未声明的标识符“jo”
-此外,
计数器
声明为返回
int
,但它不返回任何内容,因此整个程序具有未定义的行为或者。请做一个。请提供完整的代码和输入,预期输出。我忘记将其编辑为good@TedLyngmoI。我在底部添加了一个输入和一个输出@gauravbharadwaj@NoNameDR您需要打开更多警告。如果使用
g++
clang++
添加
-Wall-Wextra-Werror-pedantic-pedantic错误
,并修复e问题..例如:
计数器
不能期望返回
6
,因为它仍然不返回任何内容,所以它仍然具有未定义的行为。
int counter(const string& str)
bool isin(const string& s,char x)