Форум программистов, компьютерный форум CyberForum.ru

String is not null terminated - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 00:22     String is not null terminated #1
Почему появляется ошибка в данном куске кода?

C++
1
2
3
4
5
6
7
8
9
10
11
String String::operator+ (const String &right)
{
    String temp;
    temp.length = this->length + right.length + 1;
    delete [] temp.sPtr;
    temp.sPtr = new char[temp.length];
    assert(sPtr != 0);
    strcpy_s(temp.sPtr, this->length + 1, this->sPtr);
    strcat_s(temp.sPtr, right.length + 1, right.sPtr);
    return temp;
}
Вылазит сообщение String is not null terminated.
Первая строка (strcpy) копирует включая нулевой символ, так как length + 1.
Вторая строка (strcat) находит этот нулевой символ и начинает оттуда копировать дальше, тоже включая нулевой символ.

Добавлено через 19 минут
Окей почитал доки, заменил предыдущий код на
C++
1
2
3
4
5
6
7
8
9
10
11
String String::operator+ (const String &right)
{
    String temp;
    temp.length = this->length + right.length;
    delete [] temp.sPtr;
    temp.sPtr = new char[temp.length + 1];
    assert(sPtr != 0);
    strcpy_s(temp.sPtr, temp.length + 1, this->sPtr);
    strcat_s(temp.sPtr, temp.length + 1, right.sPtr);
    return temp;
}
Но в результате тогда не работает следующий.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const String &String::operator= (const String &right)
{
    if (&right != this)
    {
        delete [] sPtr;
        length = right.length;
        sPtr = new char[length + 1];
        assert(sPtr != 0);
                //вот эта следующая строка выдает Buffer is too small
        strcpy_s(sPtr, length + 1, right.sPtr);
    }
    return *this;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2013, 00:22     String is not null terminated
Посмотрите здесь:

C++ Ошибка: declaration terminated incorrectly
C++ Не работает код: m_web1.Navigate ('gidro.htm',0,0,NULL,NULL);
Declaration terminated incorrectly в чем ошибка? C++
string, invalid null pointer C++
Declaration terminated incorectly C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.02.2013, 00:26     String is not null terminated #2
Потому что вы пытаетесь провернуть операцию над объектом, который по сути не является массивом символов.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 00:33  [ТС]     String is not null terminated #3
Почему? sPtr Объявлялся как
C++
1
char *sPtr = new char[x];
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
12.02.2013, 00:33     String is not null terminated #4
Цитата Сообщение от kebal Посмотреть сообщение
strcat_s(temp.sPtr, right.length + 1, right.sPtr);
По документации к функции надо длину target-буфера указывать, т. е. temp.length
Строчкой выше тоже нужно эту же длину указывать, но там не повлияло, поскольку копируемая строка короче буфера.
===
Опоздал. Медленно соображаю.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 01:03  [ТС]     String is not null terminated #5
В чем же тогда проблема тут?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const String &String::operator= (const String &right)
{
    if (&right != this)
    {
        delete [] sPtr;
        length = right.length;
        sPtr = new char[length + 1];
        assert(sPtr != 0);
                //следующай строка не работает
        strcpy_s(sPtr, length + 1, right.sPtr);
    }
    return *this;
}
Тут ведь уже всё правильно по идее? А вылазит опять ошибка.

Добавлено через 6 минут
Оказалось, что нет, ошибка до сих пор прячется тут
C++
1
2
3
4
5
6
7
8
9
10
11
String String::operator+ (const String &right)
{
    String temp;
    temp.length = this->length + right.length;
    delete [] temp.sPtr;
    temp.sPtr = new char[temp.length + 1];
    assert(sPtr != 0);
    strcpy_s(temp.sPtr, temp.length + 1, this->sPtr);
    strcat_s(temp.sPtr, temp.length + 1, right.sPtr);
    return temp;
}
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
12.02.2013, 01:57     String is not null terminated #6
Пройдите отладчиком, проверьте длины у this и right. Может, они неправильно установлены.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 02:26  [ТС]     String is not null terminated #7
Неужели никто не знал, что возвращать не примитивные типы нельзя? прогеры ппц
Ошибка оказалась в том, что я пытался вернуть экземпляр класса.
C++
1
2
String temp;
return temp;
А всего-то надо было переделать до вида
C++
1
2
3
4
5
6
7
8
9
10
11
String String::operator+ (const String &right)
{
    String *temp = new String();
    temp->length = this->length + right.length;
    delete [] temp->sPtr;
    temp->sPtr = new char[temp->length + 1];
    assert(sPtr != 0);
    strcpy_s(temp->sPtr, temp->length + 1, this->sPtr);
    strcat_s(temp->sPtr, temp->length + 1, right.sPtr);
    return *temp;
}
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
12.02.2013, 04:05     String is not null terminated #8
Подумайте ещё. Всё можно. Что-то вы путаете.

Добавлено через 1 час 23 минуты
Вот посмотрите тупой работающий пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
 
class Vec2 {
    int x,y;
public:
    Vec2() {x=y=0;}
    Vec2(int i, int j) {x=i; y=j;}
    //Vec2(Vec2 &v) {x=v.x; y=v.y;}
    Vec2 operator+(Vec2 op2);
    Vec2 operator=(Vec2 op2);
    void show();
};
 
Vec2 Vec2::operator+(Vec2 op2) {
    Vec2 temp;
    temp.x=x+op2.x;
    temp.y=y+op2.y;
    return temp;
}
Vec2 Vec2::operator=(Vec2 op2) {
    x=op2.x;
    y=op2.y;
    return *this;
}
void Vec2::show() {
    cout << x << ' ' << y << '\n';
}
 
int main() {
    Vec2 a(1,2), b(3,-1),c(-5,2), d;
    d=a+b+c;
    a.show();
    b.show();
    c.show();
    d.show();
    return 0;
}
И в вашем примере возвращать temp можно. Но при этом надо реализовывать конструктор копирования. Надеюсь, вы это сделали в своем классе, код которого вы нам не показали. У меня в классе выделения динамической памяти нет, и поэтому конструктор копирования я закомментировал, меня устроил конструктор копирования по умолчанию. Сложных примеров приводить не хочется, тем более после ваших ппц общаться с вами брезгливо.
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 13:35  [ТС]     String is not null terminated #9
Да, вы правы. Спасибо, теперь я во многом разобрался. Объяснял мне ещё другой человек, и он возможно ошибся, а я так глупо вас оскорбил, так как потратил около трёх часов на поиск этой ошибки и был зол не понятно почему.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2013, 13:41     String is not null terminated
Еще ссылки по теме:

Declaration terminated incorrectly C++
declaration terminated incorrectly C++
C++ Как правильно завершить char array (Null terminated)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
palva
12.02.2013, 13:41     String is not null terminated
  #10

Не по теме:

Ладно, забудем. Обращайтесь.

Yandex
Объявления
12.02.2013, 13:41     String is not null terminated
Ответ Создать тему
Опции темы

Текущее время: 18:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru