Как добавить строку в конец строки?

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class String
{
private:
    char* s;
    int size;
public:
    String()
    {
        s = NULL;
        size = 0;
    }

    String(const char* str)
    {
        size = strlen(str);
        s = new char[size];
        for (int i = 0; i < size; i++)
            s[i] = str[i];
    }

    String(const String& obj)
    {
        size = obj.size;
        s = new char[size];
        for (int i = 0; i < size; i++)
            s[i] = obj[i];
    }

    String(int x)
    {
        size = x;
        s = new char[size];
    }

    char& operator[](int i)
    {
        return *(s + i);
    }

    const char operator[](int i) const
    {
        return *(s + i);
    }

    String& operator+(const char& str) // append a char at the end of string
    {
        int newsize = size + 1;
        String newstr(size);
        for (int i = 0; i < size; i++)
        {
            newstr.s[i] = s[i];
        }
        newstr.s[size] = str;
        delete[]s;
        s = newstr.s;
        size = newsize;
        return *this;
    }

    String& operator+(char*& str) // append a string at the end of string
    {
        int newsize = size + strlen(str);
        String newstr(newsize);
        for (int i = 0; i < size; i++)
        {
            newstr.s[i] = s[i];
        }
        for (unsigned i = 0; i < strlen(str); i++)
        {
            newstr.s[size + i] = str[i];
        }
        delete[]s;
        s = newstr.s;
        size = newsize;
        return *this;
    }

    operator int() const
    {
        int m;
        m = size;
        return m;
    }
};

int main()
{
    String s1("abcd");

    String s2;
    s2 = s1 + 'e';

    cout << s2[3];
    cout << s2[4];
    char* c = (char*)"asdfgh";
    s2 = s1 + c;
    cout << s2[3];
    cout << s2[4];
    cout << s2[8];

}

Мой код работает отлично до утверждения char* c = (char*)"asdfgh". После этого утверждения я не получаю фактический результат. s2[3] после оператора char* c = (char*)"asdfgh" должен давать 'd' на выходе, и аналогично s2[4] должен давать 'a' на выходе, а s2[8] должен давать 'g' на выходе. Но проблема в том, что когда я запускаю эту программу, я не получаю эти фактические значения.

Пожалуйста, посмотрите на это и скажите мне, где мне нужно внести изменения.

char* c = (char*)"asdfgh"; ... бросать сюда, чтобы избавиться от ошибки про const просто... плохо.
ChrisMM 23.04.2022 01:53

В C++ строковые литералы являются константами. Вам нужен указатель на const char. Вам не хватает постоянной части.

Thomas Matthews 23.04.2022 01:58
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
2
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обе ваши реализации operator+ неверны.

Вы изменяете добавляемый объект String, а затем возвращаете ссылку на этот объект. Вместо этого вам нужно вернуть новый объект String, который представляет собой конкатенацию добавленных и добавленных из String объектов, вообще не изменяя добавляемый к String. То, что вы реализовали, больше подходит для operator+=.

Дополнительные сведения см. в статье Каковы основные правила и идиомы перегрузки операторов?.

Тем не менее, есть и другие проблемы с вашим кодом. Например, вам не хватает деструктора и оператора присваивания копии согласно Правило 3/5/0. Вы также можете рассмотреть возможность добавления конструктора перемещения и оператора присваивания перемещения.

Попробуйте еще что-нибудь вроде этого:

#include <iostream>
#include <cstring>
#include <utility>
using namespace std;

class String
{
private:
    char* s;
    size_t size;

public:
    String()
    {
        s = nullptr;
        size = 0;
    }

    String(const char* str)
    {
        size = strlen(str);
        s = new char[size+1];
        for (int i = 0; i < size; ++i)
            s[i] = str[i];
        s[size] = '\0';
    }

    String(const String& str)
    {
        size = str.size;
        s = new char[size+1];
        for (int i = 0; i < size; ++i)
            s[i] = str[i];
        s[size] = '\0';
    }

    String(String&& str)
    {
        size = str.size; str.size = 0;
        s = str.s; str.s = nullptr;
    }

    String(size_t x)
    {
        size = x;
        s = new char[size+1];
        s[size] = '\0';
    }

    ~String()
    {
        delete[] s;
    }

    void swap(String& other)
    {
        std::swap(s, other.s);
        std::swap(size, other.size);
    }

    String& operator=(char ch)
    {
        String newstr(1);
        newstr[0] = ch;
        newstr.swap(*this);
        return *this;
    }

    String& operator=(const char* str)
    {
        String(str).swap(*this);
        return *this;
    }

    String& operator=(const String& str)
    {
        if (this != &str)
            String(str).swap(*this);
        return *this;
    }

    String& operator=(String&& str)
    {
        String(std::move(str)).swap(*this);
        return *this;
    }

    char& operator[](size_t i)
    {
        return s[i];
    }

    const char operator[](size_t i) const
    {
        return s[i];
    }

    String operator+(char ch)
    {
        /*
        String newstr(*this);
        newstr += ch;
        return newstr;
        */
        String newstr(size + 1);
        for (int i = 0; i < size; ++i)
        {
            newstr[i] = s[i];
        }
        newstr[size] = ch;
        return newstr;
    }

    String operator+(const char* str)
    {
        /*
        String newstr(*this);
        newstr += str;
        return newstr;
        */
        size_t slen = strlen(str);
        String newstr(size + slen);
        for (size_t i = 0; i < size; ++i)
        {
            newstr[i] = s[i];
        }
        for (size_t i = 0; i < slen; ++i)
        {
            newstr[size + i] = str[i];
        }
        return newstr;
    }

    String& operator+=(char ch)
    {
        String newstr(size + 1);
        for (size_t i = 0; i < size; ++i)
        {
            newstr[i] = s[i];
        }
        newstr[size] = ch;
        newstr.swap(*this);
        return *this;
    }

    String& operator+=(const char* str)
    {
        size_t slen = strlen(str);
        if (slen > 0)
        {
            String newstr(size + slen);
            for (size_t i = 0; i < size; ++i)
            {
                newstr[i] = s[i];
            }
            for (size_t i = 0; i < slen; ++i)
            {
                newstr[size + i] = str[i];
            }
            newstr.swap(*this);
        }
        return *this;
    }

    size_t getSize() const
    {
        return size;
    }
};

int main()
{
    String s1("abcd");

    String s2;
    s2 = s1 + 'e';

    cout << s2[3];
    cout << s2[4];
    s2 = s1 + "asdfgh";
    cout << s2[3];
    cout << s2[4];
    cout << s2[8];
}

Ответ кажется правильным, но не могли бы вы внести некоторые изменения в код и опубликовать для меня?

Xcrood Coding 23.04.2022 01:59

потому что я пытался, но я все еще получаю ту же ошибку

Xcrood Coding 23.04.2022 01:59

@XcroodCoding смотрите мой обновленный ответ.

Remy Lebeau 23.04.2022 02:24

Причина, по которой он терпит неудачу, на самом деле раньше

String s1("abcd");
String s2;
s2 = s1 + 'e';

потому что ваш оператор + изменяет свои левые, а затем возвращает ссылку на себя, s2 теперь является копией s1. Но они оба указывают на один и тот же массив символов 's', и вскоре после этого все идет наперекосяк.

Это было бы исправлено, если бы у вас был оператор =, который делает то же самое, что и ваш конструктор копирования, но у вас его нет.

И, как указывает Реми, ваша семантика operator+ в любом случае неверна. Вы должны вернуть 'newStr'

Другие вопросы по теме