Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/56: Рейтинг темы: голосов - 56, средняя оценка - 4.70
VladSharikov
22 / 22 / 7
Регистрация: 02.12.2010
Сообщений: 824
1

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

20.01.2013, 10:49. Просмотров 11105. Ответов 11
Метки нет (Все метки)

Всем привет.
Выполняю небольшую лабораторную на строки, давно не занимался! что-то забыл, что-то и так не знал.
такой вопрос.
есть класс СТРОКА, у него есть конструктор с параметром, принимающий указатель на строку 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?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 10:49
Ответы с готовыми решениями:

появилась загвоздка с функцией. нужно вывести на экран строку, сост. из звездочек. Длина строки-параметр функциииз звезд. длина строки -
Я видела, что на форуме есть подобные задачи, но ни одно из их решений не работает на моем dev...

Нуль-терминальные строки. C++
Помогите решить задачи: 1) Дан текст проверить, правильно ли записаны буквосочетания "ча" и "ща",...

В матрице последний нуль каждой строки заменить на заданное число
Помогите решить задачу в С++, массивы Написать два варианта программы: без применения указателей и...

Найти количество отрицательных не кратных 3 чисел строки, у которой первый элемент нуль
Найти количество отрицательных не кратных 3 чисел строки, у которой первый элемент нуль, помогите...

Удалить из строки числа кратные 2, если длина строки кратна 2
#include <iostream> #include <string> #include <conio.h> using namespace std; int main(int...

11
korep
52 / 45 / 18
Регистрация: 06.01.2013
Сообщений: 624
20.01.2013, 10:57 2
Зачем вам такая морока, если все реализовано в классе String (помойму), просмотрите библиотеку, там точно код рабочий
0
Schizorb
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
20.01.2013, 10:58 3
если пользоваться strcpy, то строка скопируется вместе с нуль-терминатором, поэтому памяти нужно выделить strlen+1 элементов, но вручную \0 не надо добавлять.
1
Van111
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 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;
 
}
0
20.01.2013, 11:10
taras atavin
4189 / 1779 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
20.01.2013, 11:10 5
Цитата Сообщение от VladSharikov Посмотреть сообщение
внимание вопрос: память под строку в классе надо выделять таким же размером или на один больше и вручную добавлять \0?
Указатель на char - это уже на строку с терминальным нолём, а как ты хочешь хранить - это уже твоё дело. Можешь скопировать с терминальным нолём циклом с постусловием на терминальный ноль в источнике, можешь выделить только на символы и в отдельное поле записать длину, можешь и терминальный ноль скопировать и длину в поле записать, можешь вообще при копировании преобразовать однобайтную кодировку в многобайтную, или наоборот, всё равно ведь счёт отдельным циклом до копирования. Можно вообще не заниматься копированием содержимого, а просто присвоить адрес из параметра в поле. ИМХО последнее не желательно.
0
Van111
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 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);
0
VladSharikov
22 / 22 / 7
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 11:43  [ТС] 7
korep, в стандартном?
мое задание написать класс СТРОКА, я об этом писал.
Schizorb, то есть strlen считает длину строки без нуль терминатора, а strcpy копирует содержимое строки в строку вместе с ним (с "\0"), правильно?
taras atavin, вам тот же вопрос, что и Schizorb.
Van111, вы извините, но я не лошара же вроде какой (или по моему коду это видно :'( ?), чтобы кодом ответ кидать, я же конкретный вопрос задаю, а не условие скидываю, чтобы за меня сделали. привычка помогать таким образом конечно хорошо, но русский язык тоже не надо забывать
0
Van111
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 12
20.01.2013, 11:47 8
Цитата Сообщение от VladSharikov Посмотреть сообщение
внимание вопрос: память под строку в классе надо выделять таким же размером или на один больше и вручную добавлять \0?
строка + ноль - для того чтоб можно было обрабатываться str... подобными, если вы сделает возможность получения char*.
и введение Leigh поможет с экономить на strlen
0
VladSharikov
22 / 22 / 7
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 11:52  [ТС] 9
Van111, я это понимаю, но вопрос о другом.

Не по теме:

почему Leigh?
=-O

0
Schizorb
511 / 463 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 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'
1
VladSharikov
22 / 22 / 7
Регистрация: 02.12.2010
Сообщений: 824
20.01.2013, 12:06  [ТС] 11
Schizorb,
как раз думал на счет strcat (его поведение с '\0')
Цитата Сообщение от Schizorb Посмотреть сообщение
Data[1] = '\0'
и как раз думал на счет этого, что лучше сделать так.

спасибо, Вы меня выручили.
0
Van111
214 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,816
Записей в блоге: 12
20.01.2013, 12:35 12
Цитата Сообщение от VladSharikov Посмотреть сообщение
почему Leigh?
потому что, у меня с англиским проблема))
0
20.01.2013, 12:35
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 12:35

Если длина введенной строки кратна 4, первую часть строки поменять местами со второй
Если длина введенной строки кратна 4, первую часть строки поменять местами со второй.

Удалить из строки среднюю букву, если длина строки нечётная или две средних в противном случае
Строки. Дана строка S. Удалите из неё среднюю букву, если длина строки нечётная или две средних в...

Длина строки в С++
Проблема с программой,дальше мыслей нету никаких. Нужно чтобы программа определяла длину...


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

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

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