【问题标题】:How to create 'char *[]' in c++?如何在 C++ 中创建 'char *[]'?
【发布时间】:2014-02-28 11:46:44
【问题描述】:

我正在尝试从 C++ 调用 C 库。该接口需要char* []。如果我通过const char * [],编译将失败。

如何安全地创建其中之一? 这是我能做的最好的,但我不知道它是否正确。我正在创建仅包含 1 个 c 字符串的数组。

string attr = "memberUid";
vector<char> attr_v(attr.begin(), attr.end());
attr_v.push_back('\0');
char * attrs[] = {&attr_v[0]};

我不想触发已弃用的转换警告,即触发以下内容的警告:

char * attr = "memberUid";

【问题讨论】:

  • constness and pointers to pointers 的可能重复项……请注意,char *[] 作为函数参数是 char ** 的同义词。
  • char attr[] = "memberUid"; char *attrs[] = { attr };
  • WhozCraig,那行得通,为什么 char * attr = "memberUid" 算作已弃用的转换,但 char attr[] 不算?他们不是都只是设置一个char数组缓冲区吗?
  • 您尝试调用的 C 函数是否修改了您传递给它的字符串?如果是这样,我觉得 WhozCraig 的评论很好。如果没有,我会使用从字符串文字到 char * 的显式转换。
  • 顺便说一句,OP 的解决方案有效。

标签: c++ c++11


【解决方案1】:

假设你有一个字符串向量 (std::vector&lt;std::string&gt;),我将其称为source

std::vector<char*> asArgument( source.size() );
std::transform(
    source.begin(), source.end(),
    asArgument.begin(),
    []( std::string const& elem ) { return const_cast<char*>( elem.c_str() ); } );
cFunction( asArgument.data(), asArgument.size() );

如果您需要 char* 的数组被 NULL 终止,只需 用source.size() + 1 创建asArgument

当然,如果你需要字符串字面量:

char const* asArgument[] = { ... };

可以解决问题,在呼叫站点使用const_cast (const_cast&lt;char**&gt;( asArgument ))。

这假设被调用的函数实际上并没有尝试 修改任何东西; const 的缺席只是因为它 是遗留代码。如果它确实修改了传递给的任何字符串 它,你将不得不制作深拷贝。

【讨论】:

  • +1 给出合理的答案。 nit:我会通过明确指定 lambda 的结果类型来支持更多的编译器。
【解决方案2】:

希望这会有所帮助,for 循环需要初始化整个数组

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
  vector<string> attr_v;
  attr_v.push_back("10");
  char * attr[100];
  attr[0]= const_cast<char*>(attr_v[0].c_str()); 
   return 0;
}

【讨论】:

  • 一个循环,或std::transform
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 2021-07-19
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多