C ++:终止调用'std :: out_of_range'what():basic_string :: substr:__pos(1)> this->size()(0)

Posted

技术标签:

【中文标题】C ++:终止调用\'std :: out_of_range\'what():basic_string :: substr:__pos(1)> this->size()(0)【英文标题】:C++: terminate called 'std::out_of_range' what(): basic_string::substr: __pos (which is 1) > this->size() (which is 0)C ++:终止调用'std :: out_of_range'what():basic_string :: substr:__pos(1)> this->size()(0) 【发布时间】:2020-11-20 11:56:15 【问题描述】:

我有一个 C++ 代码,我在其中读取了一个仅包含 A、C、G、T 的字符串

如果我转到字符串,我正在尝试找到最小的部分(K 号),每个部分都有所有四个字符(A、C、G、T)

当我运行代码并输入字符串时,它给了我这个错误:

在抛出 'std::out_of_range' 的实例后调用终止 what(): basic_string::substr: __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";


这里是“isin 函数”(检查该部分是否包含字符)

bool isin(string s,char x)

for(int i = 0;i < s.size();i++)
    if(x == s[i])
        return true;
    

return false;

如果我理解正确,错误在于str.substr(j,i)

预期输入和输出:ACCGTTAA -> 6

【问题讨论】:

error: use of undeclared identifier 'jo'counter 函数中 - 同样,counter 被声明为返回 int 但它没有 return 任何东西,因此整个程序具有未定义的行为。请发minimal reproducible example。 请提供兼容的代码和输入,预期输出。 我忘了把它编辑成好的@TedLyngmo 我在底部添加了一个输入和一个输出@gauravbharadwaj @NoNameDR 您需要打开更多警告。如果您使用g++clang++ 添加-Wall -Wextra -Werror -pedantic -pedantic-errors 并修复问题。例如:counter 不能返回6,因为它仍然不返回任何东西 所以它仍然有未定义的行为。 【参考方案1】:

str.size() 是一个无符号值,所以str.size() - 1str.size() == 0 时会回绕并变成一个大值。

你应该检查是否str.size() == 0,并在循环之前单独处理这种情况。

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

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

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

【讨论】:

以上是关于C ++:终止调用'std :: out_of_range'what():basic_string :: substr:__pos(1)> this->size()(0)的主要内容,如果未能解决你的问题,请参考以下文章

C ++:终止调用'std :: out_of_range'what():basic_string :: substr:__pos(1)> this->size()(0)

C ++线程未加入“没有活动异常的终止调用”

c++ 在抛出 'std::out_of_range' 实例后调用终止 what(): basic_string::insert

问题 - 在抛出 'std::out_of_range' what(): basic_string::substr:? 的实例后调用 C++ 终止

抛出“std::length_error”实例后调用 C++ 终止,what(): basic_string::_M_create

c++ 中的错误:“在抛出 'std::length_error'what() 的实例后调用终止:basic_string::_M_replace_aux”