【问题标题】:How to Convert a String Array to a Char * Array c++如何将字符串数组转换为 Char * 数组 c++
【发布时间】:2023-03-18 22:55:02
【问题描述】:

所以我想将参数传递给以下函数

execve(char *filename, char *argv[], char *envp[])

目前我的argv[] 是一个字符串数组。我想把它转换成char* array,这样我就可以把它传递给这个函数了。

我环顾四周,发现了许多将字符串转换为char 数组的方法,但是我想如何将字符串数组转换为 char 数组的数组是正确的术语 有什么帮助吗?

【问题讨论】:

  • 通过字符串数组,你的意思是像string myargs[5];,你想把它传递给execve吗?
  • char *argv[] 实际上是char* 元素的数组。数组中的每个元素都指向一个char* 字符串。因此argv[0] 是一个可以打印/使用的char* 字符串。
  • @us2012 是的,字符串数组是指字符串数组,如字符串 myargs[5]

标签: c++ arrays c string exec


【解决方案1】:

您需要获取std::strings 中数据的地址。请注意,这些不需要以空值结尾,即您需要确保所有字符串都以空值结尾。此外,作为argv 传递的数组也需要最后一个元素是空指针。您可以使用以下代码:

std::string array[] = { "s1", "s2" };
std::vector<char*> vec;
std::transform(std::begin(array), std::end(array),
               std::back_inserter(vec),
               [](std::string& s){ s.push_back(0); return &s[0]; });
vec.push_back(nullptr);
char** carray = vec.data();

使用 C++03 编译时,需要进行一些更改:

  1. 您需要创建一个合适的函数或函数对象来执行相同的转换,而不是使用 lambda 表达式。
  2. 您需要使用0,而不是使用nullptr
  3. 在 C++03 中,std::string 不能保证是连续的,也就是说,您需要一个额外的辅助 std::vector&lt;char&gt; 来保存连续的字符序列。
  4. 没有函数begin()end() 推断数组的大小,但它们可以在C++03 中轻松实现:

    template <typename T, int Size> T* begin(T (&array)[Size]) { return array; }
    template <typename T, int Size> T* end(T (&array)[Size]) { return array + Size; }
    
  5. C++03 std::vector&lt;T&gt; 没有data() 成员,也就是说,您还需要获取第一个元素的地址。

【讨论】:

  • 我是否需要包含任何库这些是我得到的错误'transform'不是'std'的成员'begin'不是'std'的成员错误:'end'是不是“std”警告的成员:lambda 表达式仅适用于 -std=c++0x 或 -std=gnu++0x [默认启用] 'nullptr' 未在此范围内声明
  • 您需要使用 C++11 选项编译或使用函数对象而不是 lambda 表达式和 0 而不是 nullptr。当然,您还需要包含相关的标准标头(在本例中为 &lt;algorithm&gt;&lt;iterator&gt;&lt;string&gt;&lt;vector&gt;)。
  • 我已经包含了vector和iostream并使用了命名空间std
  • 即使在包含 之后,我仍然得到 'begin' 并且 'end' 不是 'std' 的成员 .. 我在 ubuntu 12.04 上使用 g++
  • @user2557844:我猜,你编译时没有-std=c++11-std=c++0x。在这种情况下,您可能需要定义 begin()end() 函数。
【解决方案2】:

以下内容对我有用:

const char *argv[]{"-l", nullptr};
execvp("ls", const_cast<char**>(argv));

由于它们是字符串字面量,因此您不需要以空值终止它们,但您仍然需要在数组末尾使用空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 2015-11-30
    • 2011-10-04
    • 1970-01-01
    • 2012-05-16
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多