从字符串中分离出2个单词

时间:2018-07-20 19:26:19

标签: c++

我已经在线阅读了大量有关此主题的文章,无法弄清楚我的代码是否有效。我正在使用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;
}

2 个答案:

答案 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才能编译。