Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153

String is not null terminated

12.02.2013, 00:22. Показов 7048. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.02.2013, 00:22
Ответы с готовыми решениями:

Ошибка "String is not NULL terminated"
Пытаюсь добавить к строке "stroka_polychennaya2" строку "например, " : strcat_s(stroka_polychennaya2, "например, \0"). Но выдает об...

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

String is not null terminated в функции wcscat_s
Здравствуйте. Я считываю файл строками через getline. Данные ложу в переменную fileStr (тип char). После этого делаю: ...

9
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
12.02.2013, 00:26
Потому что вы пытаетесь провернуть операцию над объектом, который по сути не является массивом символов.
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 00:33  [ТС]
Почему? sPtr Объявлялся как
C++
1
char *sPtr = new char[x];
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
12.02.2013, 00:33
Цитата Сообщение от kebal Посмотреть сообщение
strcat_s(temp.sPtr, right.length + 1, right.sPtr);
По документации к функции надо длину target-буфера указывать, т. е. temp.length
Строчкой выше тоже нужно эту же длину указывать, но там не повлияло, поскольку копируемая строка короче буфера.
===
Опоздал. Медленно соображаю.
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 01:03  [ТС]
В чем же тогда проблема тут?
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
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
12.02.2013, 01:57
Пройдите отладчиком, проверьте длины у this и right. Может, они неправильно установлены.
0
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 02:26  [ТС]
Неужели никто не знал, что возвращать не примитивные типы нельзя? прогеры ппц
Ошибка оказалась в том, что я пытался вернуть экземпляр класса.
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
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
12.02.2013, 04:05
Подумайте ещё. Всё можно. Что-то вы путаете.

Добавлено через 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
9 / 9 / 2
Регистрация: 02.11.2012
Сообщений: 153
12.02.2013, 13:35  [ТС]
Да, вы правы. Спасибо, теперь я во многом разобрался. Объяснял мне ещё другой человек, и он возможно ошибся, а я так глупо вас оскорбил, так как потратил около трёх часов на поиск этой ошибки и был зол не понятно почему.
0
12.02.2013, 13:41

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2013, 13:41
Помогаю со студенческими работами здесь

Что такое Spool и Null-terminated string?
Мне непонятны следующие слова: Spool (что-то связано с принтером) Null-terminated string Заранее спасибо.

Какое принципиальное отличие между string = "" и string = null
Какое принципиальное отличие c# между string = &quot;&quot; и string = null?

string, invalid null pointer
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; #define SIZE 450 ...

Параметр query string возвращает null
Здравствуйте!!! Помогите понять почему возвращается null. Есть урл...

Source code string cannot null bytes
Здщравствуйте. С питоном начал знакомиться недавно, и столкнулся с такой проблемой (см. название) Код: def L(r, n=17): return...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru