【问题标题】:C++ Error: Cannot initialize an array element of type 'char' with an lvalue of type 'char [1024]'C++ 错误:无法使用“char [1024]”类型的左值初始化“char”类型的数组元素
【发布时间】:2021-02-25 04:10:58
【问题描述】:

首先我将字符串转换为 char 类型

//Convert string to char
string temp = "TFTFTFTFTFFFTTFFTTFFTTTTTTFFFF";   
string temp = line;
char tab2[1024];
strcpy(tab2, temp.c_str());
    
cout << "The value of the string conversion is: " << tab2 <<endl;

然后我尝试将 tab2 的内容分配给 char 数组:

char Array[] = {tab2};

错误:无法使用 'char [1024] 类型的左值初始化'char' 类型的数组元素

【问题讨论】:

  • 这能回答你的问题吗? How to copy a char array in C?
  • 我不同意这是一个适当的重复,即使它可能会导致一个可行的程序,因为它没有解释为什么会出现这种特定的语法/错误——并且 C 和 C++ 之间存在差异在一些意想不到的地方。这个问题也被标记为 C++,因此有更好的方法来处理上下文中的字符串。
  • 看起来更像是为什么我不能用另一个数组初始化一个数组而不是一个字符串问题。
  • 也许改用char *Array = tab2;?取决于更高级别的编码目标。
  • 您可以轻松地为此使用std::vector,但目前还不清楚目标是什么。你得到的错误是因为你根本无法做到这一点。

标签: c++ string char syntax-error


【解决方案1】:

你做不到

 char Array[] = {tab2};

因为期望表达式 tab2 按照初始化列表语法绑定到数组的元素。你做不到

 char Array[] = tab2;

either ,因为数组 tab2 的名称衰减为指向其第一个元素的指针。 C 中也存在同样的问题,可以用同样的方法解决。可以逐个元素地复制它们,使用memcpystrcpy 或C++ 惯用的std::copy,或者使用数组作为聚合的一部分。但是 C++ 有一个可以在 &lt;array&gt; 中使用的聚合:

std::array<char,1024> tab2;

// we really have to check length there, you can overflow this buffer 

strcpy(tab2.data(), temp.c_str());

auto Array = tab2;

允许浅拷贝的结构也可以:

struct S {
    char _data[1024];
    char* data() { return _data; }
};

Sstd::array 上执行的浅拷贝拷贝每个元素的存储 源到目的地。这不能与指针一起使用,因为指针将被复制,而不是它指向的存储空间。

这本质上是std::array&lt;char,1024&gt; 的模型,减去了它的花里胡哨。

【讨论】:

    【解决方案2】:

    在您的情况下发生的情况是您试图用另一个 c 样式数组初始化一个 c 样式数组。

    C 风格的数组不能以这种方式初始化,也不能使用常规的复制赋值进行复制。
    要使用复制分配复制它,需要循环并一次复制一个元素,并且实际上为第二个数组分配一个大小。

    有两种更实用的方法可以解决您的问题。 使用std::array&lt;&gt; 或其他容器类型,而不是char 数组,或者使用memcpy

    对于前一种方法,您只需将数组替换为输入std::array&lt;&gt;,然后您可以根据需要使用常规复制分配进行初始化或复制。

    对于后一种方法,您可以使用memcpy() 将内存块从第一个 c 样式数组复制到另一个。像这样:

    在 memcpy 上阅读这些参考页面: http://www.cplusplus.com/reference/cstring/memcpy https://en.cppreference.com/w/cpp/string/byte/memcpy

    {
        /* ... */
        char new_tab[1024] = {0}; 
        std::memcpy(new_tab, prev_tab, sizeof(char)*1024);
        std::cout << "The value after copy is: " << new_tab << std::endl;
        /* ... */
    }
    

    编辑:

    由于您的意图尚不清楚,但假设它是一个赋值,您必须转换为一个数组,然后将该数组复制到另一个数组。 在这种情况下,请阅读以下内容以供参考: https://en.cppreference.com/w/cpp/string/byte/strncpy http://www.cplusplus.com/reference/cstring/strncpy/

    然后保持原样,但只需更改您的char Array[] = {tab2}; 致:

    {
        /* ... */
        char new_tab[1024];
        // Copies 1024 characters from prev_tab to new_tab
        std::strncpy(new_tab, prev_tab, 1024);
        /* ... */
    }
    

    注意:还编辑并添加了一些参考链接

    【讨论】:

    • 谢谢伙计,这很好!我仍在为大学课程学习 C++。
    • 这似乎修改了我的 Macontosh 上的 C++ 系统文件 ostream,现在程序在构建时中断,所以可能不是最好的解决方案。
    • @JeremiahFries 您在构建时遇到什么错误?段错误?我提到的向量的第一个选项是内存安全的,第二个选项你需要确保你没有写入只读内存。也许您不小心将内存直接复制到了ostream?供参考 baout memcpy:en.cppreference.com/w/cpp/string/byte/memcpy。与使用 c 样式数组和手动复制内存相比,使用 std::string std::vector&lt;char&gt;std::array&lt;char, size&gt; 之类的预定义容器对您来说都是更安全的选择。
    • @JeremiahFries 如果您不能使用上述任何容器作为某种限制,那么我已经添加并编辑了足够的答案。请记住关于 strncpy 的这一点:“如果 source 长于 num,则不会在目标末尾隐式附加空字符。因此,在这种情况下,不应将目标视为空终止的 C 字符串(这样读取它会溢出)。” cplusplus.com/reference/cstring/strncpy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多