【问题标题】:C++ string or char* to char pointer array (char**) with spaces as a deliminator [duplicate]C ++字符串或char *到char指针数组(char **),空格作为分隔符[重复]
【发布时间】:2021-05-23 13:01:20
【问题描述】:

我正在从命令行创建一个与 main 风格相同的函数 void foo(int argc, char** argv)。使用来自std::cin 的输入。

我尝试了几个主要使用 strtok 和向量的想法,以及涉及直接从输入流中读取和重新分配数组的方法。但是如果没有大量的数组重新分配或使用似乎有不必要开销的向量,就无法确定实现这一目标的最佳方法。

void foo(int argc, char** argv) {
   //do somthing.
   return;
}

int main() {
   std::string tmp;
   std::getline(std::cin, tmp)

   //code here.

   foo(var_count, vars);
}

非常感谢。

编辑:进一步调查,c 风格的 strtok 功能已被弃用,并已被似乎存在平台兼容性问题的新变体取代。

【问题讨论】:

  • 你能解释一下为什么吗?出于遗留原因,main 命令行输入界面采用这种方式。现代 C++ 有更好的方法来传递信息。
  • 不了解 OP,但我曾经不得不构建一个 QApplication,其参数不一定从 main 转发。我同意如果可能的话应该避免它。

标签: c++ string inputstream


【解决方案1】:

您在这里遇到了一些问题。您不确定字符串大小是多少,但您需要一个字符数组。如果我是你,我会坚持使用 strtok() 或者类似 std::list 的东西,你可以随时调整它的大小并以(相对)快速的速度访问。

示例...

std::list<char*> delim_list;
char_evaluate = strtok (tmp," ");
while (char_evaluate != NULL)
{
  list.push_back(char_evaluate);
  char_evaluate = strtok (NULL, " ");
}

还没有把它扔进编译器,所以如果有问题请告诉我。

【讨论】:

    【解决方案2】:

    类似于 main 的函数的问题是字符串文字是 const 并且您需要可变的 char* 指针的连续序列。并且您需要确保 char* 指向的任何内容在 foo() 结束之前都不会被释放。

    除了参数字符串拆分之外,这应该可以工作:

    std::vector<std::string> args = {"hello", "world"};
    std::vector<char*> c_args;
    for (auto& arg: args) c_args.push_back(&arg[0]);
    foo(static_cast<int>(c_args.size()), c_args.data());
    

    【讨论】:

    • 明天将对此进行测试,但看起来它几乎可以满足这里的需求。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多