What(): basic_string::_M_construct null 无效

Ama*_*mar 4 c++ string vector c-strings strtok

我正在制作一个程序,我需要使用一个将字符串的标记存储在向量中的函数。该功能无法正常工作,因此我在较小的程序上尝试了该功能。当然,我使用了字符串分词器函数。但它没有按预期工作。首先,这是代码:

#include <向量>
#include <字符串>
#include <cstring>
使用命名空间 std;

int main()
{
    矢量<字符串> v;
    字符串输入=“我的名字是阿曼库马尔”;
    
    char* ptr = strtok((char*)input.c_str(), " ");
    v.push_back((字符串)ptr);

    而(指针)
    {
        ptr = strtok(NULL," ");
        v.push_back((字符串)ptr);
    }
    cout<<"出来了";
    for(字符串 s:v)
    {
        cout<<s<<endl;
    }
}

现在问题来了。我认为这个问题与命令有关:

(string)ptr
Run Code Online (Sandbox Code Playgroud)

这个东西在第一次调用中工作得很好,但在 while 循环中出现时会出错。如果我将其注释掉并打印 ptr,那么它可以正常工作,但是程序会在 while 循环后终止,甚至不会执行

cout<<"coming out";
Run Code Online (Sandbox Code Playgroud)

不考虑向量的内容。但同样,如果我也不打印 ptr,则会打印存储在向量中的第一个令牌“My”。我确实找不到造成这种情况的原因。任何建议都会有帮助。

Ala*_*les 7

while(ptr)
{
    ptr = strtok(NULL," ");
    v.push_back((string)ptr);
}
Run Code Online (Sandbox Code Playgroud)

由于最后一个标记ptr将为空,因此std::string从空指针构造 a 是未定义的行为。尝试:

while(ptr = strtok(NULL," "))
{
    v.push_back(string(ptr));
}
Run Code Online (Sandbox Code Playgroud)

对于更多 C++ 解决方案:

#include <vector>
#include <string>
#include <iostream>
#include <sstream>

int main()
{
    std::vector<std::string> v;
    std::string input = "My name is Aman Kumar";
    
    std::stringstream ss(input);
    
    std::string word;
    while(ss >> word)
    {
        v.push_back(word);
    }
    std::cout << "Coming out\n";
    for(std::string& s:v)
    {
        std::cout << s << "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)