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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
#1

String is not null terminated - C++

12.02.2013, 00:22. Просмотров 1909. Ответов 9
Метки нет (Все метки)

Почему появляется ошибка в данном куске кода?

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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2013, 00:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос String is not null terminated (C++):

Как правильно завершить char array (Null terminated) - C++
В гугле вижу самые разные примеры. char* chs = new char; ... chs = '\0'; // Разве 128 существует ? ... delete chs; пробовал...

string, invalid null pointer - C++
#include <stdio.h> #include <iostream> #include <string> using namespace std; #define SIZE 450 ...

Could not convert variant of type (Null) into type (String) - C++
if(DBLookupComboBoxDoctor->ListField.IsEmpty()) ...

Не работает код: m_web1.Navigate ('gidro.htm',0,0,NULL,NULL); - C++
Друзья помогите начинаюшему значит делаю m_web1.Navigate ('с:\gidro.htm',0,0,NULL,NULL);работает делаю m_web1.Navigate...

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...

declaration terminated incorrectly - C++
Делал лабу на C++ и возникла проблема - &quot;declaration terminated incorrectly&quot;, Кто-нибудь может сказать в чем ошибка? Задача в том что бы...

9
xtorne21st
интересующийся
304 / 275 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.02.2013, 00:26 #2
Потому что вы пытаетесь провернуть операцию над объектом, который по сути не является массивом символов.
0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 00:33  [ТС] #3
Почему? sPtr Объявлялся как
C++
1
char *sPtr = new char[x];
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,092
Записей в блоге: 4
12.02.2013, 00:33 #4
Цитата Сообщение от kebal Посмотреть сообщение
strcat_s(temp.sPtr, right.length + 1, right.sPtr);
По документации к функции надо длину target-буфера указывать, т. е. temp.length
Строчкой выше тоже нужно эту же длину указывать, но там не повлияло, поскольку копируемая строка короче буфера.
===
Опоздал. Медленно соображаю.
0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 01:03  [ТС] #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;
}
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,092
Записей в блоге: 4
12.02.2013, 01:57 #6
Пройдите отладчиком, проверьте длины у this и right. Может, они неправильно установлены.
0
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 02:26  [ТС] #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;
}
0
palva
2628 / 1855 / 268
Регистрация: 08.06.2007
Сообщений: 7,092
Записей в блоге: 4
12.02.2013, 04:05 #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 можно. Но при этом надо реализовывать конструктор копирования. Надеюсь, вы это сделали в своем классе, код которого вы нам не показали. У меня в классе выделения динамической памяти нет, и поэтому конструктор копирования я закомментировал, меня устроил конструктор копирования по умолчанию. Сложных примеров приводить не хочется, тем более после ваших ппц общаться с вами брезгливо.
1
kebal
9 / 9 / 0
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 13:35  [ТС] #9
Да, вы правы. Спасибо, теперь я во многом разобрался. Объяснял мне ещё другой человек, и он возможно ошибся, а я так глупо вас оскорбил, так как потратил около трёх часов на поиск этой ошибки и был зол не понятно почему.
0
palva
12.02.2013, 13:41     String is not null terminated
  #10

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2013, 13:41
Привет! Вот еще темы с ответами:

Declaration terminated incorectly - C++
#include &lt;iostream.h&gt;; #include &lt;stdio.h&gt;; int main() { int p,r,s,l,k,d,; cin&gt;&gt; p,r,d; k=r; for (int...

Declaration terminated incorrectly - C++
#include&lt;stdio.h&gt; { int a,b,c; a=5; b=7; c=a*b; printf(&quot;multiplication=%d\n&quot;,c); } Помогите пожалуйста найти...

Ошибка: declaration terminated incorrectly - C++
ко знает что за ошибка помогите #include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; void main(); {clrscr(); const...

No such file or directory compilation terminated - C++
Из-за чего возникает такая ошибка? Или он не видит библиотеку, если не видит, то как подключить?


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

Или воспользуйтесь поиском по форуму:
10
12.02.2013, 13:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru