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

Длина строки и нуль-терминатор - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.80
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 10:49     Длина строки и нуль-терминатор #1
Всем привет.
Выполняю небольшую лабораторную на строки, давно не занимался! что-то забыл, что-то и так не знал.
такой вопрос.
есть класс СТРОКА, у него есть конструктор с параметром, принимающий указатель на строку char* (или же есть метод Set, принимающий то же самое). внутри мне необходимо очистить что было, при необходимости, выделить новую память, записать туда содержимое параметра char*.
внимание вопрос: память под строку в классе надо выделять таким же размером или на один больше и вручную добавлять \0?

то есть
C++
1
2
3
4
5
String::String(const char *_Data) {
    Data = new char[strlen(_Data)+1]; 
    strcpy(Data, _Data);    
    strcat(Data, "\0");
}
или же, достаточно просто выделить место под строку такого же размера как и параметр и нуль-терминатор добавится сам/не нужен?
C++
1
2
3
4
String::String(const char *_Data) {
    Data = new char[strlen(_Data)]; 
    strcpy(Data, _Data);    
}
Вот

то же самое, например, с конструктором, принимающим символ.
нужно так?
C++
1
2
3
4
5
String::String(const char symbol) {
    Data = new char[2]; 
    Data[0] = symbol;
    strcat(Data, "\0");
}
или достаточно выделить место только под сам символ?
C++
1
2
3
4
String::String(const char symbol) {
    Data = new char[1]; 
    Data[0] = symbol;
}
и не добавлять вручную нуль-терминатор.
выручайте, пожалуйста

Добавлено через 1 минуту
вопрос в догонку.
считать длину моей строки (в классе) длиной с нуль-терминатором или без?

допустим вызвали конструктор с параметром char - символ один. считать длину строки = 1? или считать длину строки символ + нуль-терминатор = 2?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
korep
 Аватар для korep
47 / 40 / 9
Регистрация: 06.01.2013
Сообщений: 566
20.01.2013, 10:57     Длина строки и нуль-терминатор #2
Зачем вам такая морока, если все реализовано в классе String (помойму), просмотрите библиотеку, там точно код рабочий
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
20.01.2013, 10:58     Длина строки и нуль-терминатор #3
если пользоваться strcpy, то строка скопируется вместе с нуль-терминатором, поэтому памяти нужно выделить strlen+1 элементов, но вручную \0 не надо добавлять.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
20.01.2013, 11:10     Длина строки и нуль-терминатор #4
C++
1
2
3
4
5
6
7
String::String(const char symbol) {
Data = new char[2]; 
Data[0] = symbol;
Data[1] = 0;
Leight = 1;
 
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.01.2013, 11:10     Длина строки и нуль-терминатор #5
Цитата Сообщение от VladSharikov Посмотреть сообщение
внимание вопрос: память под строку в классе надо выделять таким же размером или на один больше и вручную добавлять \0?
Указатель на char - это уже на строку с терминальным нолём, а как ты хочешь хранить - это уже твоё дело. Можешь скопировать с терминальным нолём циклом с постусловием на терминальный ноль в источнике, можешь выделить только на символы и в отдельное поле записать длину, можешь и терминальный ноль скопировать и длину в поле записать, можешь вообще при копировании преобразовать однобайтную кодировку в многобайтную, или наоборот, всё равно ведь счёт отдельным циклом до копирования. Можно вообще не заниматься копированием содержимого, а просто присвоить адрес из параметра в поле. ИМХО последнее не желательно.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
20.01.2013, 11:27     Длина строки и нуль-терминатор #6
C++
1
2
3
4
5
String::String(const char *_Data) {
    Leight = strlen(_Data) + 1;
    Data = new char[Leight]; 
    memcpy(Data, _Data, Leight);    
}
Добавлено через 13 минут
Цитата Сообщение от Van111 Посмотреть сообщение
Код C++
String::String(const char *_Data) {
* * Leight = strlen(_Data) + 1;
* * Data = new char[Leight];
* * memcpy(Data, _Data, Leight); * *
}
C++
1
2
3
4
String::String(const char *_Data) {
* * Leight = strlen(_Data) ;
* * Data = new char[Leight]; 
* * memcpy(Data, _Data, Leight + 1);
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 11:43  [ТС]     Длина строки и нуль-терминатор #7
korep, в стандартном?
мое задание написать класс СТРОКА, я об этом писал.
Schizorb, то есть strlen считает длину строки без нуль терминатора, а strcpy копирует содержимое строки в строку вместе с ним (с "\0"), правильно?
taras atavin, вам тот же вопрос, что и Schizorb.
Van111, вы извините, но я не лошара же вроде какой (или по моему коду это видно :'( ?), чтобы кодом ответ кидать, я же конкретный вопрос задаю, а не условие скидываю, чтобы за меня сделали. привычка помогать таким образом конечно хорошо, но русский язык тоже не надо забывать
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
20.01.2013, 11:47     Длина строки и нуль-терминатор #8
Цитата Сообщение от VladSharikov Посмотреть сообщение
внимание вопрос: память под строку в классе надо выделять таким же размером или на один больше и вручную добавлять \0?
строка + ноль - для того чтоб можно было обрабатываться str... подобными, если вы сделает возможность получения char*.
и введение Leigh поможет с экономить на strlen
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 11:52  [ТС]     Длина строки и нуль-терминатор #9
Van111, я это понимаю, но вопрос о другом.

Не по теме:

почему Leigh?

Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
20.01.2013, 12:03     Длина строки и нуль-терминатор #10
Цитата Сообщение от VladSharikov Посмотреть сообщение
то есть strlen считает длину строки без нуль терминатора, а strcpy копирует содержимое строки в строку вместе с ним (с "\0"), правильно?
Да, можете почитать описание функций:
strcpy
strlen
Можно использовать strncpy, он скопирует столько символов, сколько укажете, и \0 добавлять не будет (если вы явно не укажете скопировать строку вместе с \0)

Кстати strcat тоже у вас не правильно работает:

C++
1
2
3
Data = new char[2]; 
Data[0] = symbol; // чему равен symbol[1], symbol[2].... и где встретится первый \0, чтобы сработала strcat?
strcat(Data, "\0"); // добавляет в конец два нуль-символа \0 \0 - с выходом за пределы
Во-первых, Data должна быть нуль-терминирована, чтобы было известно, куда добавлять вторую строку. Во вторых, strcat сам добавляет нуль-терминатор к результату. Поэтому правильнее и проще - Data[1] = '\0'
VladSharikov
 Аватар для VladSharikov
22 / 22 / 1
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 12:06  [ТС]     Длина строки и нуль-терминатор #11
Schizorb,
как раз думал на счет strcat (его поведение с '\0')
Цитата Сообщение от Schizorb Посмотреть сообщение
Data[1] = '\0'
и как раз думал на счет этого, что лучше сделать так.

спасибо, Вы меня выручили.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 12:35     Длина строки и нуль-терминатор
Еще ссылки по теме:

C++ длина строки
появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки - C++
Написать программу, которая определяет длину строки - strlen (число символов без завершающего нуль-символа) C++

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

Или воспользуйтесь поиском по форуму:
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
20.01.2013, 12:35     Длина строки и нуль-терминатор #12
Цитата Сообщение от VladSharikov Посмотреть сообщение
почему Leigh?
потому что, у меня с англиским проблема))
Yandex
Объявления
20.01.2013, 12:35     Длина строки и нуль-терминатор
Ответ Создать тему
Опции темы

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