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() - 1
在str.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++ 在抛出 '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”