Проблема с доморощенным методом Concat

#c #string #concat

#c #строка #объединение

Вопрос:

Я реализовал свой собственный String класс, и мне нужно написать Concat метод.

Я не могу заставить его работать.

Мой код:

 //the m_str is private member which is initialize in the c-tor
//this function is get a string and concat it with the original string
String amp;String::Concat(const char *string)
{
    int original_str_size = length(m_str);
    int other_str_size = length(string);
    int needed_length = original_str_size   other_str_size   1;

    char *str_copy = m_str;

    del();

    m_str = new char[needed_length];
    m_size = needed_length;

    int index = 0;

    for(; index < original_str_size; index  )
    {
        if(index < original_str_size)
            m_str[index] = str_copy[index];
        else
            m_str[index] = string[index];
    }

    m_str[index] = 0;

    return *this;
}
  

Проблема в Concat методе заключается в том, что я написал что-то вроде:

 String word3 = word1.Contact(word2);
  

Предполагается, что он должен word3 быть похожим word1 word2 , но при запуске программы произошел сбой.

Когда я писал:

 cout << word1.Contact(word2).Length();
  

… он напечатал только word длину 1 вместо общей длины.

Комментарии:

1. Чтобы иметь возможность помочь вам, нам нужно точно знать, что идет не так, просто «не работает» — это очень расплывчатое описание. Также, если вы сможете создать более короткий пример, который демонстрирует проблему (убедитесь, что он компилируется и выполняется), вы получите больше ответов.

2. «я бы внедрил свой собственный класс String» — боже, почему yyyyyyy?

3. @Dor S — В Compare функции-члене — for(; *pSRC==*pSTR amp;amp; *pSRC!='';pSRC ,pSTR ) . Что, если pSRC указывает на abcd и pSTR на ab ? Условие, которое *pSRC != '' не выполняется, но увеличивается pSTR после второй итерации, вызывая неопределенное поведение . Вы всегда ожидаете, что pSRC больше или равно длине pSTR .

4. @jalf : Не психуй … 🙂 … Возможно, это для целей обучения… Серьезно, кто из пользователей не пытался написать версию <string.h> (проверить) или персональную версию объекта string (проверить) просто для изучения C / C ?… 😛 … Теперь, если это для производственного кода, позвольте мне присоединиться к «ohricharddawkinswhyyyyyyyy!!!» (Я атеист)

5. Хранит ли ваш String класс свою собственную длину? Вы не изменяете это в Concat() . Также Concat() требуется const char* , а не другое String . Я надеюсь, что вы делаете это в качестве упражнения, потому что в производственном коде нет места для другой String реализации.

Ответ №1:

Давайте рассмотрим следующий код:

 int index = 0;
for(; index < original_str_size; index  )
{
    if(index < original_str_size)
        m_str[index] = str_copy[index];
    else
        m_str[index] = string[index];
}
  

Посмотрите на условие вашего цикла, затем посмотрите на ваше условие if. Очевидно, что блок else никогда не будет выполнен, и ваша строка никогда не будет объединена.

Чтобы устранить эту проблему, ваше условие цикла должно быть заменено на needed_length . Тогда вам пришлось бы заменить string[index] на string[index - original_str_size] , чтобы получить правильный индекс в string .

Ваш код должен выглядеть следующим образом:

 int index = 0;
for(; index < needed_length; index  )
{
    if(index < original_str_size)
        m_str[index] = str_copy[index];
    else
        m_str[index] = string[index - original_str_size];
}
  

Кстати, на что str_copy указывает? Допустима ли память? del() Освободил память? Возможно, стоит это проверить.

Комментарии:

1. я изменил код на код вашего ответа. все еще не работает. мой код del() выглядит так: аннулирует строку::del() { if(m_str != 0) { удалить []m_str; m_str = 0; m_size = 0; } }

2. Ну, тогда вы также удалили строку, на которую указывает str_copy. Не вызывайте del(), а затем вызывайте delete[] str_copy после того, как закончите с этим.

Ответ №2:

В вашей функции Concat похоже, что вы удаляете память, содержащую вашу исходную строку, перед копированием строки из этой памяти во вновь выделенную память.

Комментарии:

1. Итак, как я могу скопировать sring в выделенную вещь, чтобы она работала?

Ответ №3:

Для сравнения, у вас есть ; после цикла for это означает, что цикл ничего не делает. Также вы возвращаете 0 при совпадении первого символа.

В Concat вы создаете str_copy = m_str , затем предположительно удаляете m_str и создаете новый m_str. затем вы копируете из удаленного m_str в новый m_str, возможно, вам повезет, но я бы не стал на это полагаться.

Комментарии:

1. сравнение выполнено нормально. О контакте — что я должен сделать, чтобы исправить это «Не уверен на 4»?

2. сначала вам нужно будет скопировать исходный m_str. Или, другими словами, создайте временный символ * и обновите нужное количество. Выполните все ваши копирования и добавления (также обратите внимание на @Marlon), затем удалите m_str, затем сделайте m_str = temporary .

3. Кроме того, сравнение было не в порядке.

4. Кроме того, теперь вы отредактировали вопрос, ваш заголовок неправильный. И большая часть контекста моего ответа отсутствует.

5. я изменил код, и теперь я инициализирую ‘copy’ исходной строкой.. вот так: String str_copy(m_str); … правильно ли писать таким образом?