C ++返回整个null分隔的字符串

时间:2015-12-15 20:19:58

标签: c++ char

我需要给一个函数一个空终止的字符序列,但我无法弄清楚如何从字符串文字最终转到一个字符指针。问题在这里得到证明:

#include <iostream>
#include <string>

using namespace std;

int main ()
{
  std::string str ("this\0is a\0null separated\0string");
  std::cout << "The size of str is " << str.size() << " bytes.\n\n";

  return 0;
}

我目前的代码有效..

    std::string tmp = g_apidefs[i].ret_val +'.'+ g_apidefs[i].parm_types +'.'+ g_apidefs[i].parm_names +'.'+ g_apidefs[i].html_help;

    size_t length = 1+strlen(tmp.c_str());
    g_apidefs[i].dyn_def = new char[length];
    memcpy(g_apidefs[i].dyn_def, tmp.c_str(), length);
    char* p = g_apidefs[i].dyn_def;
    while (*p) { if (*p=='.') *p='\0'; ++p; }

    ok &= rec->Register(g_apidefs[i].regkey_def, g_apidefs[i].dyn_def) != 0;

...它将.变为\0,但是有没有办法让\0首先出现?我最初使用strdup(少了几行代码),但有一些特定于平台的不兼容问题。

我想知道是否有C ++ 11或C ++ 14处理此方法?

3 个答案:

答案 0 :(得分:7)

您可以使用char数组并使用此数组的迭代器初始化您的字符串,例如:

template <int N>
std::string make_string(char const (&array)[N]) {
    return std::string(array, array + N);
}

int main() {
    std::string s = make_string("foo\0bar");
}

如定义的那样,字符串也将包含终止空字符。如果不需要,只需减去1即可。这适用于所有版本的C ++。

答案 1 :(得分:0)

我发布自己的答案作为替代方案,万一有人发现它有用:

std::vector<std::string> str_vect ={ str1,str2,str3,str4 };

std::vector<char> char_arr
for (const auto& str : str_vect) {
    char_arr.insert(char_arr.end(), str.begin(), str.end());
    char_arr.push_back('\0');
}

答案 2 :(得分:0)

这是我真正需要的答案,它非常简单,不知道我花了好几个小时试图弄明白

ford, Chrysler, pontiac, cadillac 

感谢@DietmarKühl提出的最终让我得出这个结论的小提示。

很好。现在,这个Stackoverflow问题解决了处理空字符的两个问题。