【问题标题】:cannot copy string to an character array无法将字符串复制到字符数组
【发布时间】:2018-04-16 11:58:37
【问题描述】:
#include<iostream>
class ravi
{
    private:
        char a[10],char b[10];
public:
    void setdata(char x[10],char y[10])
    {
        a = x; b = y;
    }
    void show()
    {
        std::cout << a << b;
    }
};
int main()
{
    ravi r;
    r.setdata("text","copied");
    r.show();
}

我正在尝试将字符串“文本”“已复制”复制到 x 和 y,但出现“从 char* 到 char 的赋值中的类型不兼容”的错误。有人能告诉我我的代码有什么问题吗?

【问题讨论】:

  • C++ 中的字符串是std::string。您正在使用 char 数组,即 C 字符串、NUL 终止字符串等。
  • C 字符串不是这样工作的。尝试使用std::string 并避免麻烦。
  • 使用std::string a, b; 代替char a[10], b[10]; 并将setdata 更改为void setdata(const std::string&amp; x, const std::string&amp; y)。不要忘记#include &lt;string&gt;。这比使用 C 字符串要好得多。
  • 你知道什么是构造函数吗?

标签: c++ arrays string class setter


【解决方案1】:

C++ 中的字符串是std::string。您正在使用更难操作的 char 数组,即 C 字符串、NUL 终止字符串等。

只需替换 ab 的类型(并对 setdata 的参数进行小幅改进,您就可以工作,加上 string 的一些有用功能:

#include <string>
class ravi
{
    std::string a;
    std::string b;
public:
    void setdata(const char* x, const char* y)
    {
        a = x;
        b = y;
    }

    void show()
    {
        std::cout << a << b;
    }
};

如果可能(关于ravi 的API),请尝试使用std::string const&amp; 代替const char*

void setdata(std::string const& x, std::string const& y)

对于 C++17,您最好使用 std::string_view 代替 const char* 作为参数类型:

void setdata(std::string_view x, std::string_view y)

【讨论】:

  • 并不总是想太多的字符串视图,但你必须喜欢这样一个事实,它现在只需要一个函数来接受所有变体纯字符字符串,而不会强制调用者使用 c_str 或分配或者什么不是。
  • @StoryTeller 如果我没记错的话const std::string&amp; 也会接受所有这些。如果我错了,请纠正我。
  • @Everyone "没有 [...] 分配或什么没有" 将char* 等传递给string 构造函数将从它构造一个string,其中(除非优化SSO)意味着分配,只是为了得到一些无论如何只能持续一次调用的东西。
  • @underscore_d 从技术上讲,它可以完成这项工作,但需要更多空间和周期(对于大于 SSO 能力的字符串)。无论如何,谢谢你的提示,从现在开始我将使用std::string_view
  • @YSC "C++ 中的字符串是 std::string。"这是完全错误的说法。
【解决方案2】:

数组没有复制赋值运算符。所以这些陈述

a=x;b=y;

无效。

您应该使用标头&lt;cstring&gt; 中声明的标准C 函数strcpystrncpy 来复制字符数组。 C++ 中的字符串文字也有常量字符数组的类型。所以成员函数setdata的参数应该用限定符const声明。

void setdata( const char x[], const char y[] )
{
    strncpy( a, x, sizeof( a ) );
    a[sizeof( a ) - 1] = '\0';

    strncpy( b, x, sizeof( b ) );
    b[sizeof( b ) - 1] = '\0';
}

考虑到这个说法是无效的

char a[10],char b[10];

你应该写

char a[10]; char b[10];

char a[10], b[10];

【讨论】:

  • "数组没有复制赋值运算符。" std::array 确实如此,这就是它通常比普通数组更好的各种原因之一。并不是说仅此一项就可以解决 OP 假设的问题。
  • @underscore_d std::array 不是数组。它是一个用户定义的容器。
  • "数组没有复制赋值运算符。"当他们到达那个声明时,他们没有衰减到指针吗?
  • @VladfromMoscow 其实我没说是数组。但无论哪种方式,很明显我为什么这么说,因为用户定义的容器被写成考虑作为一个数组用于许多目的,而且迂腐没有用处。
  • @underscore_d 你只会把读者和你不相关的 cmets 混淆。
【解决方案3】:

使用string.h中的strcpy函数:

#include <string.h>

void setdata(char x[10],char y[10])
{
    strcpy(a,x);
    strcpy(b,y);
}

【讨论】:

  • 为什么不使用strcpy_sstrcpy 不应该再被使用了......如果你能解释一下为什么他正在做的事情不起作用,那就太好了。
  • 更好的解决方案是将字符数组替换为std::string
猜你喜欢
  • 2016-01-05
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多