【问题标题】:Converting char* to an array of strings by splitting通过拆分将 char* 转换为字符串数组
【发布时间】:2020-08-19 10:16:00
【问题描述】:

我想将char* 一行命令转换为字符串数组。我尝试了什么:

void parse(char* cmd, int length) {
    std::string *arguments = nullptr;
    int amount = 0;
    for (int i = 0; i < length; i++) {
        if (cmd[i] == ' ' || cmd[i] == '\t' || cmd[i] == '\n') {
            amount++;
            continue;
        }
        arguments[amount] = cmd[i];
    }
}

但我不确定std::string *arguments = nullptr; 部分。我不知道cmd 中的参数数量,所以我不确定如何正确初始化arguments 数组。在 C 中我可能应该用 malloc 解决它,但我如何在 C++ 中解决它?另外,由于我想返回argumentsamount,如何将它们作为参数引用传递给parse 字符串?

【问题讨论】:

  • @esii cmd 是否指向字符串?
  • 首选使用vector。在 C++ 中避免 vector 类似于在 C 中避免 memsetstrcmp
  • 如果你的第一个想法是在 C 中使用 malloc,那么你在 C++ 中的第一个想法应该是使用 std::vectorstd::unique_ptr
  • '如何在 C++ 中解决它?'使用字符串向量std::vector&lt;std::string&gt; arguments;。使用push_back 将字符串添加到向量中,使用push_back 将字符添加到字符串中。
  • std::istringstreamstd::vector&lt;std::string&gt; 的使用使这个操作变得微不足道。

标签: c++


【解决方案1】:

您没有为arguments 分配任何内存来指向。使用std::vector&lt;std::string&gt; 而不是std::string*。另见Splitting strings in C++

试试这样的:

#include <string>
#include <vector>
#include <cctype>

std::vector<std::string> parse(const char* cmd, int length) {
    std::vector<std::string> arguments;
    const char *start = cmd;
    const char *stop = cmd + length;
    while (start < stop) {
        while ((start < stop) && isspace(*start)) ++start;
        if (start == stop) break;
        const char *end = start + 1;
        while ((end < stop) && !isspace(*end)) ++end;
        arguments.push_back(std::string(start, end-start));
        start = end + 1;
    }
    return arguments;
}

Live Demo

或者,operator&gt;&gt; 会为您处理空白解析,因此您可以将 cmd 数据包装在 std::istringstream 中并循环遍历它,例如:

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

std::vector<std::string> parse(char* cmd, int length) {
    std::vector<std::string> arguments;
    std:istringstream iss(std::string(cmd, length));
    std::string s;
    while (iss >> s) {
        arguments.push_back(s);
    }
    return arguments;
}

Live Demo

【讨论】:

  • 参数类型应改为const char *
  • 谢谢!我试图通过char* arguments[MAX]; 但由于某种原因我得到了不匹配。你知道为什么吗?
  • @vesii 这是char* 的数组,但您的函数需要char*
  • @vesii 您是在尝试填充您传入的char*[] 数组,还是尝试解析这样的数组?你需要更具体。请编辑您的问题并提供更多详细信息。
猜你喜欢
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 2013-04-25
  • 2012-11-04
相关资源
最近更新 更多