#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); … правильно ли писать таким образом?