【问题标题】:c++ How to initialize char in constructorc ++如何在构造函数中初始化char
【发布时间】:2020-10-04 12:12:42
【问题描述】:
    #include <iostream>
    using namespace std;

    class MyClass
    {
        private :
        char str[848];

        public :

        MyClass()
        {

        }

        MyClass(char a[])  
        {
            str[848] = a[848];
        }

        MyClass operator () (char a[])
        {
            str[848] = a[848];
        }

        void myFunction(MyClass m)
        {

        }

        void display()
        {
            cout << str[848];
        }
    };

    int main()
    {   
        MyClass m1;  //MyClass has just one data member i.e. character array named str of size X
                                //where X is a constant integer and have value equal to your last 3 digit of arid number
        MyClass m2("COVID-19") , m3("Mid2020");
        m2.display(); //will display COVID-19
        cout<<endl;
        m2.myFunction(m3);
        m2.display(); //now it will display Mid2020
        cout<<endl;
        m3.display(); //now it will display COVID-19
      //if your array size is even then you will add myEvenFn() in class with empty body else add myOddFn()
      return 0;    

    } 

我不能使用string,因为我被告知不要使用,因此,我需要知道如何使它显示所需的输出

【问题讨论】:

  • str[848] = a[848]; 行没有达到您的意思。
  • 是的,这就是为什么我想知道在这里做什么
  • 你需要明确任务是什么。即使您必须避免使用std::string,您也可以将字符串存储为char*char[],并且每个选项都有其优缺点。更不用说将其存储为 std::unique_ptr&lt;char&gt;std::shared_ptr&lt;char&gt;std::array&lt;char, 848&gt;...
  • 为什么是 848?您是否需要精确的 847 个字符?您可能在这里的每种情况下都想要std::string。如果您出于某种原因需要避免使用std::string,请分配一个您实际需要的大小的缓冲区,而不是一些看似随机的长度。
  • 指定我们应该使用长度作为我们的最后3位数字或卷号

标签: c++ arrays constructor


【解决方案1】:

如何在构造函数中初始化char数组?

  1. 使用循环逐个元素复制:
MyClass(char a[])  
{
    //make sure that sizeof(a) <= to sizeof(str);
    // you can not do sizeof(a) here, because it is
    // not an array, it has been decayed to a pointer

    for (int i = 0; i < sizeof(str); ++i) {
        str[i] = a[i];
    }
}
  1. 使用来自&lt;algorithm&gt;std::copy
const int size = 848;
std::copy(a, a + size, str); 

首选std::copy 而不是strcpy,如果您必须使用strcpy,请改用strncpy。您可以为其指定大小,这样有助于防止错误和缓冲区溢出。

MyClass(char a[])  
{
    strncpy(str, a, sizeof(str));
}
  1. 使用库中的std::array。它有很多优点,例如你可以像普通变量一样直接分配它。示例:
std::array<char, 848> str = {/*some data*/};
std::array<char, 848> str1;
str1 = str;

【讨论】:

    【解决方案2】:

    要复制字符串,您必须使用std::strcpy,而不是str[848] = a[848]

    str[848] = a[848] 只复制一个元素,但在你的情况下这是一个错误,因为你的数组有索引 [0, 847]。

    试试

    class MyClass
    {
        private :
        char str[848];
    
        public :
    
        MyClass()
        {
    
        }
    
        MyClass(char a[])  
        {
            std::strcpy(src, a);
        }
    
        MyClass operator () (char a[])
        {
            std::strcpy(src, a);
        }
    
        void myFunction(MyClass m)
        {
    
        }
    
        void display()
        {
            cout << str;
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 2012-10-23
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      相关资源
      最近更新 更多