如何修复'std :: logic_error'what():basic_string :: __ M_construct null无效错误?

时间:2019-01-29 20:39:05

标签: c++

我正在尝试检查输入字符串是否为字母数字或更大写或为空。如果输入的字符串在上述错误的字符串中,我只想返回false / 0,否则可以与程序的其余部分正常工作。我的程序中有问题的块:

std::string myfunc(std::string input){
    std::string b="";

    if (!input.size()) return 0;
    for (int i = 0; i < input.size(); i++){

        if ( input[i] < 'a' || input[i] > 'z'|| isalpha(input[i]) || isupper(input[i]) ) return 0;
    }
    b = input;
    //just copy the input string for now.
    return b;
}

我将此函数称为

int main(){
    std::string input="Somthing";
    std::cout << myfunc(input)<< std::endl;
    return  0;
}

遇到以下错误?

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted (core dumped)

在没有这两种情况的情况下,该程序运行良好。我无法理解该错误并找到解决方法?关于我做错了什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果要返回false(或true),则应将函数的返回类型更改为bool

bool myfunc(std::string input) {
^^^^

第二,如果您要返回false,那么您应该返回

if (!input.size()) return false;
                          ^^^^^

从布尔函数返回0并不是错误,因为0会自动转换为false,但是从风格上讲,最好说出您的意思。

答案 1 :(得分:0)

问题是您的函数中有两个return 0;语句。该函数返回一个std::string,它没有接受int作为输入的构造函数。但是,它确实有一个接受const char *指针的构造函数,该指针可以隐式转换为0。但是,使用空std::string指针构造一个char *未定义的行为,并且您的实现已选择抛出std::logic_error异常,您没有捕获到异常代码。

在这种情况下,我将只返回一个空白字符串:

std::string myfunc(const std::string &input){
    if (input.empty()) return "";
    for (int i = 0; i < input.size(); ++i){
        char ch = input[i];
        if ( !((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) ) return "";
    }
    return input;
}

然后,调用方可以根据需要检查返回值是否为空

if (myfunc(input).empty())
    // error, do something
else
    // OK, do something else

最好使用返回bool而不是std::string的函数:

bool isvalid(const std::string &input){
    if (input.empty()) return false;
    for (int i = 0; i < input.size(); ++i){
        char ch = input[i];
        if ( !((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) ) return false;
    }
    return true;
}

// if you still needed this function for something...
std::string myfunc(const std::string &input){
    if (!isvalid(input)) return "";
    return input;
}

if (!isvalid(input))
    // error, do something
else
    // OK, do something else