【问题标题】:c++ Create Char Array from Variable String passed as function parameterc++ 从作为函数参数传递的变量字符串创建字符数组
【发布时间】:2020-11-14 05:09:43
【问题描述】:

我想根据传入的字符串在函数中创建一个 char 数组。

bool foo(string s1, string s2) {
    char s1_char_array[] = s1;
    char s2_char_array[] = s2;
}

但我遇到了

 "Initialization with '{...}' expected for aggregate object."

对于这两种声明。

我尝试了很多变通方法,但它们都有自己的错误。学习 C++ 和我找到的每个教程都具有硬编码的价值。如何使这项工作?

【问题讨论】:

  • 你可以创建一个char*,你可以用new[]而不是char[]分配,因为你需要在编译时知道字符串的大小。请记住,c++ 中的数组在编译时必须具有固定大小。 = 部分也不适用于其中任何一个。
  • 你为什么想要数组?不会直接(通过operator[])使用std::string 的元素吗?如果需要数据副本,使用std::vector 或另一个std::string 怎么样?

标签: c++ arrays char


【解决方案1】:

您可以动态分配数组并从那里的字符串复制数据。

#include <string>
#include <cstring> // for strcpy()
#include <algorithm> // for std::copy()
using std::string;

bool foo(string s1, string s2) {
    // allocate arrays (+1 for terminating null-characters)
    char* s1_char_array = new char[s1.size() + 1];
    char* s2_char_array = new char[s2.size() + 1];
    // copy data to arrays
#if 0
    // if the strings are guaranteed not to contain '\0'
    strcpy(s1_char_array, s1.c_str());
    strcpy(s2_char_array, s2.c_str());
#else
    // if the strings may contain '\0'
    std::copy(s1.begin(), s1.end(), s1_char_array);
    std::copy(s2.begin(), s2.end(), s2_char_array);
    s1_char_array[s1.size()] = '\0';
    s2_char_array[s2.size()] = '\0';
#endif
    
    // do things with the arrays

    // deallocate the arrays
    delete[] s1_char_array;
    delete[] s2_char_array;
    // return something
    return false;
}

【讨论】:

    【解决方案2】:

    坏消息是,通常无法从std::string 创建数组变量,因为std::string 可以表示任意大小的字符串(存在非常大的实际限制,但首先会耗尽内存64 位系统)并且该大小是动态的,即在运行时确定。相比之下,数组的大小必须在编译时知道,而此时字符串的大小仍然未知。

    另一个问题是您的阵列具有自动存储功能,而可用于自动存储的内存非常有限——在台式机/服务器上通常为 1 到几兆字节;嵌入式的可能要少得多 - 而字符串拥有的动态内存没有这样的限制,因此尝试将大字符串放入自动存储很容易导致“堆栈溢出”。

    另一个问题是数组不能被复制构造或从其他类型转换,所以char s1_char_array[] = some_variable; 永远无法工作。


    好消息是您也不需要这样做。 std::string 内部已经包含chars 的数组,因此无需创建新数组。继续使用字符串中的数组即可。

    【讨论】:

      【解决方案3】:

      这就是我想出的。 您必须使用 string.lenght() 函数声明 char 数组大小与字符串相同,并且

      然后使用循环将字符串元素按索引复制到 char 数组索引

      bool foo(string s1, string s2) {
          
          char s1_char_array[s1.length()] ;
          char s2_char_array[s2.length()] ;
          for(int i=0; i<s1.length(); i++){
              s1_char_array[i]=s1[i];
          }
          for(int i=0; i<s2.length(); i++){
              s2_char_array[i]=s1[i];
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-11-15
        • 1970-01-01
        • 2020-05-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        相关资源
        最近更新 更多