powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просьба проверить
25 сообщений из 46, страница 1 из 2
Просьба проверить
    #34275454
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал функцию Копирования фрагмента строки в строку, начиная с Index символа и заканчивая Finish. Правильно ли она написана?

Код: plaintext
1.
2.
3.
4.
5.
 char* Copy(char* value,int Index,int Finish)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        return result;
}
...
Рейтинг: 0 / 0
Просьба проверить
    #34275515
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше memcpy использовать
...
Рейтинг: 0 / 0
Просьба проверить
    #34275535
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man_555лучше memcpy использовать

чем лучше ?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275545
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
man_555лучше memcpy использовать
С memcpy у меня ошибку выкидывает
...
Рейтинг: 0 / 0
Просьба проверить
    #34275593
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275598
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.

1. Да, малость перепутал в формулировке.

3) Посе копирования надо result[Finished] сделать равным нулем. - А это я не совсем понял
...
Рейтинг: 0 / 0
Просьба проверить
    #34275602
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275608
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША
3) Посе копирования надо result[Finished] сделать равным нулем. - А это я не совсем понял

strncpy
Функция strncpy работает аналогично, кроме того, что копируютсятолько первые n байтов строки src. Таким образом, есл и
в n байтах строки src нет нулевого байта, то строка результатане будет заканчиваться символом ‘\0’.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275612
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275617
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.

3. Подразумевалось, что char* должен заканчиваться терминатором?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275619
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?

Нет. Это после использования.
Код: plaintext
1.
delete[] result;
...
Рейтинг: 0 / 0
Просьба проверить
    #34275631
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.

3. Подразумевалось, что char* должен заканчиваться терминатором?

Да. А в твоем коде это не детерминировано.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275632
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
man_555перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?

Мне казалось, что так будет рациональнее и правельнее. Эту функцию надо будет потом вставить в dll и откомпилить на VC2006
...
Рейтинг: 0 / 0
Просьба проверить
    #34275634
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man_555перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?

1. Задание - проверить существующий код.

3. Да, стиля нет.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275648
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?

Нет. Это после использования.
Код: plaintext
1.
2.



Итак

Код: plaintext
1.
2.
3.
4.
5.
6.
 char* Copy(char* value,int Index,int Finish)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '0';
        return result;
}
Вот только не понятно, куда
Код: plaintext
delete[] result;
вставить. Перед return нельзя, а после не выполнится.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275651
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh man_555перво-наперво - какова цель, и почему не использовать stl::string?

а есть кусок кода, который отвечает за delete result? Или это надо всё-время помнить, что после copy надо вызывать delete?

imho стиль довольно-таки опасный. Зачем использовать старые C-функции заместо новых возможностей C++?

1. Задание - проверить существующий код.

3. Да, стиля нет.

А что подразумеваете под стилем?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275652
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАШАМне казалось, что так будет рациональнее и правельнее. Эту функцию надо будет потом вставить в dll и откомпилить на VC2006

Конечно в некоторых случаях можно и так писать, это как исключения из правил. Но сам для себя должен иметь обоснования такому подходу. Желательно же, чтобы каждый уровень кода сам отвечал за память которую он выделяет. Т.е. выделил память, передал функции, получил результат, использовал, очистил память.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275668
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh СИСАШАМне казалось, что так будет рациональнее и правельнее. Эту функцию надо будет потом вставить в dll и откомпилить на VC2006

Конечно в некоторых случаях можно и так писать, это как исключения из правил. Но сам для себя должен иметь обоснования такому подходу. Желательно же, чтобы каждый уровень кода сам отвечал за память которую он выделяет. Т.е. выделил память, передал функции, получил результат, использовал, очистил память.

Вот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно
...
Рейтинг: 0 / 0
Просьба проверить
    #34275670
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША Akh СИСАША Akh1) Finished - количество байт. Так и подразумевалось?
2) strncpy сюда действительно более подходит.
3) Посе копирования надо result[Finished] сделать равным нулем.
3. delete(result) - так?

Нет. Это после использования.
Код: plaintext
1.
2.



Итак

Код: plaintext
1.
2.
3.
4.
5.
6.
 char* Copy(char* value,int Index,int Finish)
{
        char* result = new char[Finish+ 1 ];
        strncpy( result, value + Index, Finish );
        result[Finish+ 1 ] = '0';
        return result;
}
Вот только не понятно, куда
Код: plaintext
delete[] result;
вставить. Перед return нельзя, а после не выполнится.

Об этом и речь. Стиль плохой. Тебе надо будет не забывать, после вызова функции и использования результата очищать память.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275701
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkhОб этом и речь. Стиль плохой. Тебе надо будет не забывать, после вызова функции и использования результата очищать память.

Но Result у меня объявлена локально, я думал очищать память надо тоже в теле функции. Или можно и вне? А как тогда обратиться к локальной переменной? Или в качестве параметра в функцию добавить указатель на область памяти Result, а потом её очистить?
...
Рейтинг: 0 / 0
Просьба проверить
    #34275714
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАШАВот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно

Для функции strncpy передают блок памяти, причем те кто передает заранее должны побеспокоится, что памяти хватит. Почему бы тебе не сделать так же?

Можно сделать с проверкой размера, если тебе его будут передавать. Тогда если не хватит памяти, то можешь вернуть ошибку или скопировать сколько влезет.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275734
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША AkhОб этом и речь. Стиль плохой. Тебе надо будет не забывать, после вызова функции и использования результата очищать память.

Но Result у меня объявлена локально, я думал очищать память надо тоже в теле функции. Или можно и вне? А как тогда обратиться к локальной переменной? Или в качестве параметра в функцию добавить указатель на область памяти Result, а потом её очистить?

Разберись сначала.
result у тебя локальная. Память у тебя глобальная. Ты возвращаешь локальную переменную. Что ты имеешь в результате? Ты имеешь значение указателя на данные, которые не в стеке а из кучи. Если бы они были из стека, то после выхода из функции ты их и использовать бы не мог. Значит ты имеешь все что надо - очищай глобальную память с указаением указателя на нее.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275741
СИСАША
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akh СИСАШАВот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно

Для функции strncpy передают блок памяти, причем те кто передает заранее должны побеспокоится, что памяти хватит. Почему бы тебе не сделать так же?

Можно сделать с проверкой размера, если тебе его будут передавать. Тогда если не хватит памяти, то можешь вернуть ошибку или скопировать сколько влезет.

Для функции strncpy передают блок памяти - а как это сделать(или посоветуйте где прочитать). До меня без примеров туго доходит. И ещё хотел спросить - есть ли для BCB6 русский хелп, или для каких нить других версий? Я немного "туговат" в English
...
Рейтинг: 0 / 0
Просьба проверить
    #34275816
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СИСАША Akh СИСАШАВот меня и мучал вопрос об очистке памяти. Память мы выделили только Result, значит и очищать надо только результ, а вот в какое "место" вставить очищение - мне не понятно

Для функции strncpy передают блок памяти, причем те кто передает заранее должны побеспокоится, что памяти хватит. Почему бы тебе не сделать так же?

Можно сделать с проверкой размера, если тебе его будут передавать. Тогда если не хватит памяти, то можешь вернуть ошибку или скопировать сколько влезет.

Для функции strncpy передают блок памяти - а как это сделать(или посоветуйте где прочитать). До меня без примеров туго доходит. И ещё хотел спросить - есть ли для BCB6 русский хелп, или для каких нить других версий? Я немного "туговат" в English

Передай указатель на память так же как и передавал указатель на строку

Код: plaintext
1.
2.
3.
func(char *dst, char*src, int offset, int n) {


};

или с указанием размера

Код: plaintext
1.
2.
3.
4.
func(char *dst, int dstSize, char*src, int offset, int n) {


};

Функции strncpy, memcpy и тому подобные - это функции стандартной библиотеки С++. С ними надо знакомится в учебнике по С++ или по С (а не билдер). Раздел, что-то про строки.
...
Рейтинг: 0 / 0
Просьба проверить
    #34275901
man_555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
strncpy, memcpy - это всё же С. С++ преследует иную идеологию в теперешнем виде.
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Просьба проверить
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]