【问题标题】:How to convert string to char array in C++?如何在 C++ 中将字符串转换为 char 数组?
【发布时间】:2012-10-28 22:42:30
【问题描述】:

我想将string 转换为char 数组,但不是char*。我知道如何将字符串转换为char*(通过使用malloc 或我在代码中发布的方式)——但这不是我想要的。我只是想将string 转换为char[size] 数组。有可能吗?

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main()
{
    // char to string
    char tab[4];
    tab[0] = 'c';
    tab[1] = 'a';
    tab[2] = 't';
    tab[3] = '\0';
    string tmp(tab);
    cout << tmp << "\n";

    // string to char* - but thats not what I want

    char *c = const_cast<char*>(tmp.c_str());
    cout << c << "\n";

    //string to char
    char tab2[1024];
    // ?

    return 0;
}

【问题讨论】:

  • 这似乎是 C++,而不是 C。
  • @FredLarson:好的,已编辑,谢谢
  • std::string to char*的可能重复

标签: c++ string type-conversion


【解决方案1】:

只需将字符串复制到带有strcpy 的数组中即可。

【讨论】:

    【解决方案2】:

    试试 strcpy(),但正如 Fred 所说,这是 C++,不是 C

    【讨论】:

      【解决方案3】:

      我能想到的最简单的方法是:

      string temp = "cat";
      char tab2[1024];
      strcpy(tab2, temp.c_str());
      

      为了安全起见,您可能更喜欢:

      string temp = "cat";
      char tab2[1024];
      strncpy(tab2, temp.c_str(), sizeof(tab2));
      tab2[sizeof(tab2) - 1] = 0;
      

      或者可能是这种方式:

      string temp = "cat";
      char * tab2 = new char [temp.length()+1];
      strcpy (tab2, temp.c_str());
      

      【讨论】:

      • strncpy 的问题是,如果它在源字符串中找到空值之前达到大小,它不会空值终止。这点也要小心!
      • 是的,我认为这是一种合理的处理方式。
      • strncpy 是为了安全,因为 strncpy 不会超出你给它的缓冲区。 strcpy_s 也不在 C99 中,但最近在 C11 中添加。
      • 我喜欢人们滥用safety这个词的方式......哦,没有足够的空间容纳字符串,所以让我们截断它......哦,我们不小心删除了信息关于患者的危及生命的药物过敏......但我们不再有缓冲区溢出。好吧,我它是安全...
      • @KarolyHorvath - 不同领域的安全性。显然,您需要检查您的功能需求并且不要做愚蠢的事情。但是,如果您超出缓冲区,您将失去任何知道会发生什么的保证。正确的编码可确保程序在您的操作系统上“安全”运行。正确的思考可确保程序“安全”地执行用户需要的操作。
      【解决方案4】:

      你可以使用strcpy(),像这样:

      strcpy(tab2, tmp.c_str());
      

      注意缓冲区溢出。

      【讨论】:

        【解决方案5】:

        最简单的方法是这样

        std::string myWord = "myWord";
        char myArray[myWord.size()+1];//as 1 char space for null is also required
        strcpy(myArray, myWord.c_str());
        

        【讨论】:

        • 数组大小必须是 C++ 中的编译时常量。
        • @PhaniRithvij 这是错误的,除非您只针对允许将其作为语言扩展的编译器,在这种情况下它仍然是不好的做法。
        【解决方案6】:
        str.copy(cstr, str.length()+1); // since C++11
        cstr[str.copy(cstr, str.length())] = '\0';  // before C++11
        cstr[str.copy(cstr, sizeof(cstr)-1)] = '\0';  // before C++11 (safe)
        

        最好避免在 C++ 中使用 C,因此应该选择 std::string::copy 而不是 strcpy

        【讨论】:

          【解决方案7】:

          好的,我很震惊没有人真正给出一个好的答案,现在轮到我了。有两种情况;

          1. 常量字符数组对你来说已经足够好了,所以你可以使用,

            const char *array = tmp.c_str();
            
          2. 或者你需要修改 char 数组所以常量不行,那么就用这个

            char *array = &tmp[0];
            

          它们都只是分配操作,而且大多数时候这正是您所需要的,如果您真的需要一个新副本,那么请关注其他伙伴的答案。

          【讨论】:

          • 他想要一个 char 数组,而不是 char *
          • 他创建的指针和char数组一样。 C 和 C++ 中的数组变量只是指向数组中第一个元素的指针。
          • @JustinC.B.并不真地!数组变量可能衰减为指针,但它们在 C++ 中不同。例如当elemchar array 时,C++ 中的std::size(elem) 定义明确,但当elemchar*const char* 时编译失败,您可以在here 看到它
          • 如果 tmp 是堆栈分配的并且超出范围但数组的生命周期更长,#2 会导致问题(悬空指针)吗?
          【解决方案8】:

          如果事先不知道字符串的大小,可以动态分配数组:

          auto tab2 = std::make_unique<char[]>(temp.size() + 1);
          std::strcpy(tab2.get(), temp.c_str());
          

          【讨论】:

            【解决方案9】:

            试试这个方法应该可以的。

            string line="hello world";
            char * data = new char[line.size() + 1];
            copy(line.begin(), line.end(), data);
            data[line.size()] = '\0'; 
            

            【讨论】:

              【解决方案10】:

              好吧,我知道这可能比较愚蠢 而不是而且简单,但我认为它应该可以工作:

              string n;
              cin>> n;
              char b[200];
              for (int i = 0; i < sizeof(n); i++)
              {
                  b[i] = n[i];
                  cout<< b[i]<< " ";
              }
              

              【讨论】:

              • 嗯,不是真的。您只是假设n 不能大于b。如果n&gt;b 会崩溃。最好使用已经提供的strcpy 函数。编辑:在某些情况下,使用 strcpy_s 可能会更好,因为它添加了对 NULL 指针的检查(如果您的平台支持它)
              【解决方案11】:

              如果您使用的是 C++11 或更高版本,我建议您使用 std::snprintf 而不是 std::strcpystd::strncpy,因为它的安全性(即,您确定可以将多少个字符写入缓冲区)并且因为它会为您终止字符串(因此您不必担心)。应该是这样的:

              #include <string>
              #include <cstdio>
              
              std::string tmp = "cat";
              char tab2[1024];
              std::snprintf(tab2, sizeof(tab2), "%s", tmp.c_str());
              

              在 C++17 中,您有以下选择:

              #include <string>
              #include <cstdio>
              #include <iterator>
              
              std::string tmp = "cat";
              char tab2[1024];
              std::snprintf(tab2, std::size(tab2), "%s", tmp.c_str());
              

              【讨论】:

                猜你喜欢
                • 2015-08-01
                • 2023-03-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-05-16
                • 2012-02-16
                • 1970-01-01
                相关资源
                最近更新 更多