【问题标题】:Making a std::string out of a Char* in C++在 C++ 中用 Char* 制作 std::string
【发布时间】:2013-03-03 21:19:44
【问题描述】:

OSX 10.8,碳

我有一个我想从 Char* 派生的 std::string

例子:

CFStringRef *s;
char *c[128];

CFStringGetCString(*s, *c, 128, kCFStringEncodingUTF8);

int size = sizeof(c);
g_uid.assign(c, size);

但是我得到一个无效的转换,我不明白为什么

error: invalid conversion from 'char**' to 'long unsigned int'

std::string g_uid = ""; 被定义为全局

【问题讨论】:

  • 这不是char *,它是char *的数组。
  • 如果你想从(const) char * 创建一个std::string,你可以这样做例如const char *blah = "foo"; std::string str = blah;.
  • 如果不清楚,可以把char *c[128];改成char c[128];就好了。

标签: c++ string type-conversion macos-carbon


【解决方案1】:

你对星号太慷慨了——你通常不需要指向CFStringRef的指针,而你的数组实际上是一个指针数组,这不是你想要的。

它应该看起来更像这样:

CFStringRef s;
char c[128];

if (CFStringGetCString(s, c, 128, kCFStringEncodingUTF8))
{
    g_uid = c;
}
else
{
     // 128 characters wasn't enough.
}

【讨论】:

  • 感谢您的解释。我当然不想要 128 个指针。
【解决方案2】:

如果cchar*,则以下方法可行:

g_uid.assign(c, size);

问题是c不是char*,它是一个由128个char*s组成的数组:

char *c[128];

【讨论】:

    【解决方案3】:

    这是 C/C++ 初学者常见的错误。我记得以前也犯过同样的错误。像这样的声明 char *c[128]; 并没有像您认为的那样为您提供 128 个字符的数组。它实际上为您提供了一个包含 128 个指向 chars 的指针的数组。你不想这样。

    您要声明一个由 128 个字符组成的数组,如下所示:

    char c[128];
    

    现在您可能不会认为cchar*,因为您看不到任何*s,但任何时候您声明一个数组时,该变量都会自动成为您指定的任何类型的指针。它实际上指向数组的第一个元素的地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-12
      • 2012-12-11
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      相关资源
      最近更新 更多