我已经在线阅读了大量有关此主题的文章,无法弄清楚我的代码是否有效。我正在使用c4droid应用程序在手机上工作,据我所知,调试器几乎没有用。 如标题所示,我需要从一个输入中分离出2个单词。根据第一个单词的含义,可以使用或不使用第二个单词。如果我不需要第二个单词,一切都很好。如果我需要并有第二个单词,它可以工作,或者似乎可以。但是,如果我需要第二个单词,但只有第一个单词,它将进行编译,但会因超出范围的异常而崩溃。 ActionCommand是具有2个元素的字符串向量。
void splitstring(std::string original)
{
std::string
std::istringstream OrigStream(original);
OrigStream >> x;
ActionCommand.at(0) = x;
OrigStream >> x;
ActionCommand.at(1) = x;
return;
}
此代码将单词分开吗? 任何帮助将不胜感激。
更多代码: 从main调用
void DoAction(Character & Player, room & RoomPlayerIn)
{
ParseAction(Player, GetAction(), RoomPlayerIn);
return;
}
std::string GetAction()
{
std::string action;
std::cout<< ">";
std::cin>>action;
action = Lowercase(action);
return action;
}
也许是小写字母。
std::string Lowercase(std::string sourceString)
{
std::string destinationString;
destinationString.resize(sourceString.size());
std::transform(sourceString.begin(), sourceString.end(), destinationString.begin(), ::tolower);
return destinationString;
)
void ParseAction(Character & Player, std::string CommandIn, room & RoomPlayerIn)
(
std::vector<std::string> ActionCommand;
splitstring(CommandIn, ActionCommand);
std::string action = ActionCommand.at(0);
if (ActionCommand.size() >1)
std::string action2 = ActionCommand.at(1);
跳过一些假设
if (action =="wield")
{
if(ActionCommand.size() >1)
DoWield(action2);
else std::cout<<"wield what??"<<std::endl;
return;
}
和拆分字符串现在看起来像这样
void splitstring(std::string const &original, std::vector<std::string> &ActionCommand)
{
std::string x;
std::istringstream OrigStream(original);
if (OrigStream >>x)
ActionCommand.push_back(x);
else return;
if (OrigStream>>x)
ActionCommand.push_back(x);
return;
}
答案 0 :(得分:0)
#include <sstream>
#include <vector>
#include <string>
std::vector<std::string> ActionCommand;
void splitstring(std::string const &original)
{
std::string x;
std::istringstream OrigStream{ original };
if(OrigStream >> x)
ActionCommand.push_back(x);
else return;
if(OrigStream >> x)
ActionCommand.push_back(x);
}
答案 1 :(得分:0)
另一个想法是使用标准库。您可以使用以下功能将字符串拆分为标记(使用空格作为分隔符):
console.log
在这里,结果是使用#include <string>
#include <vector>
#include <sstream>
#include <iterator>
inline auto tokenize(const std::string &String)
{
auto Stream = std::stringstream(String);
return std::vector<std::string>{std::istream_iterator<std::string>{Stream}, std::istream_iterator<std::string>{}};
}
在适当位置创建的,在您的示例中,该结果基本上代表std::istream_iterator
操作。
警告: 该代码至少需要c ++ 11才能编译。