【发布时间】:2020-10-15 15:31:46
【问题描述】:
我正在制作一个程序,我需要使用一个函数,该函数将字符串的标记存储在向量中。该功能无法正常工作,因此我在较小的程序上尝试了该功能。当然,我使用了字符串标记器功能。但它没有按预期工作。首先,这是代码:
#include #include #include使用命名空间标准; 主函数() { 向量 v; string input = "我的名字是阿曼库马尔"; char* ptr = strtok((char*)input.c_str(), " "); v.push_back((字符串)ptr); 而(指针) { ptr = strtok(NULL," "); v.push_back((字符串)ptr); } cout 现在的问题。我认为这个问题与命令有关:
(string)ptr这个东西在第一次调用中完美运行,但在 while 循环中出现错误。如果我将其注释掉并打印 ptr,那么它可以正常工作,但是程序在 while 循环之后终止,甚至不执行
cout<<"coming out";不理会向量的内容。但是同样,如果我也不打印 ptr,那么存储在向量中的第一个令牌“My”会被打印出来。我真的找不到导致这种情况的原因。任何建议都会有所帮助。
【问题讨论】:
-
您似乎正在使用不允许的空指针调用字符串构造函数。
-
这能回答你的问题吗? Assign a nullptr to a std::string is safe?
-
char* ptr = strtok((char*)input.c_str(), " ");这可能是个问题。c_str()返回 const C 字符串,您不得更改它。但是您正在使用(char*)input.c_str()删除常量并将其传递给strtok。strtok修改字符串。这会导致未定义的行为。 -
你不能修改
input.c_str()的结果。使用std::string函数和<algorithm>代替旧的C 接口。 -
简短而安全的版本:
std::istringstream stream(input); std::copy(std::istream_iterator<string>(stream), std::istream_iterator<string>(), std::back_inserter(v));.
标签: c++ string vector c-strings strtok