C++运行程序后给我 basic_string::_S_construct null 无效错误

C++ giving me basic_string::_S_construct null not valid error after I run my program

本文关键字:construct null 错误 无效 string C++ 程序 basic 运行      更新时间:2023-10-16

我是C++新手,我尝试编写一个简单的字符串反向程序。当我编译它时,一切都很好,但是当我运行它时,我收到以下错误:

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

我做错了什么?这是我的代码。

#include <iostream>
using namespace std;
string reverse_string(char* argv[], int i);
int main(int argc, char* argv[])
{
    for (int i = 0; i < argc; i++)
    {
        cout << reverse_string(argv, i) << endl;
    }
    return 0;
}
string reverse_string(char* argv[], int i)
{
    string arg = argv[i + 1];
    string output;
    int length = arg.length();
    for (int index = 1; index <= length; index++)
    {
        output += arg[length-index];
    }
    return output;
}

这个: 在构造反转字符串时argv[i + 1]应该是argv[i]的,主循环应该是for (i=1; i<argc; ++i)

还有更简单的方法来反转字符串:

std::string reverse_string(char* argv[], int i)
{
    std::string arg = argv[i];
    return std::string(arg.rbegin(), arg.rend());
}

此错误消息

在抛出"std::logic_error"
实例后终止调用 what(): basic_string::_S_construct 空

无效

表示您正在尝试调用 std::string 的构造函数作为参数指针 NULL 传递。问题是*(argv + argc)是空指针。

还要考虑到您必须包含标头<string>

至于反向函数,那么它可以写得比你简单得多。首先,它只能有一个类型为 const char * 的参数

例如

#include <iostream>
#include <string>
std::string reverse_string( const char* s );
int main(int argc, char* argv[])
{
    for (int i = 1; i < argc; i++)
    {
        std::cout << argv[i] << " -> " << reverse_string( argv[i] ) << std::endl;
    }
    return 0;
}
std::string reverse_string( const char* s )
{
    std::string arg( s );
    return std::string( arg.rbegin(), arg.rend() );
}
<</div> div class="answers">

好的,谢谢大家的帮助!我只是不想反转参数 0,这是程序的名称。但我找到了另一种解决方法。如果有人感兴趣,这里是固定代码:

#include <iostream>
using namespace std;
string reverse_string(char* argv[], int i);
int main(int argc, char* argv[])
{
    for (int i = 1; i < argc; i++)
    {
        cout << argv[i] << " -> " << reverse_string(argv, i) << endl;
    }
    return 0;
}
string reverse_string(char* argv[], int i)
{
    string arg = argv[i];
    string output;
    int length = arg.length();
    for (int index = 1; index <= length; index++)
    {
        output += arg[length-index];
    }
    return output;
}