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

strcpy/strcpy_s - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 98, средняя оценка - 5.00
nazavrik
 Аватар для nazavrik
22 / 22 / 2
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:28     strcpy/strcpy_s #1
Добрый вечер!

Есть класс (упрощенно):

C++
1
2
3
4
5
6
7
8
9
10
11
class const_string
{
public:
    const_string(char const* s)
    {
        strcpy(str, s); / strcpy_s(str, strlen(s), s);
        len = strlen(s);
    }
private:
    char *str;
    size_t len;
Мне нужно создать объект

C++
1
const_string s("");
Компилятор ругается в этом месте:

C++
1
strcpy(str, s); / strcpy_s(str, strlen(s), s);
Есть способ написать универсальный для char const строк конструктор без проверки на ""?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2010, 00:28     strcpy/strcpy_s
Посмотрите здесь:

Использование strcpy_s C++
Чем отличаются функции strcpy и strcpy_s C++
C++ Call to undefined function 'strcpy_s'
Подскажите, почему не работает strcpy_s() C++
Не работает strcat_s с strcpy_s C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 00:32     strcpy/strcpy_s #2
а что такое str? а что означает "/" в той же строчке?

я бы тоже ругался.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
09.02.2010, 00:36     strcpy/strcpy_s #3
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
#include <iostream>
class const_string
{
public:
    const_string(char const* s = "")
    {
        len = strlen(s);
        str = new char[len + 1];
        strcpy(str, s); // strcpy_s(str, strlen(s), s);
    }
 
    ~const_string(){ delete[] str; }
private:
    char *str;
    size_t len;
};
int main()
{
    const_string s1;
    const_string s2("");
    const_string s3("bla-bla");
 
    return 0;
}
nazavrik
 Аватар для nazavrik
22 / 22 / 2
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:39  [ТС]     strcpy/strcpy_s #4
Цитата Сообщение от novi4ok Посмотреть сообщение
а что такое str? а что означает "/" в той же строчке?
В данном случае эта наклонная палка показывает, что при использовании как отстоящего слева выражения, так и справа стоящего.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 00:41     strcpy/strcpy_s #5
Цитата Сообщение от nazavrik Посмотреть сообщение
В данном случае эта наклонная палка показывает, что при использовании как отстоящего слева выражения, так и справа стоящего.
новое слово в науке?
nazavrik
 Аватар для nazavrik
22 / 22 / 2
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:41  [ТС]     strcpy/strcpy_s #6
ISergey, спасибо. Но нужно обойтись без выделения памяти.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
09.02.2010, 00:44     strcpy/strcpy_s #7
Цитата Сообщение от nazavrik Посмотреть сообщение
ISergey, спасибо. Но нужно обойтись без выделения памяти.
Интересно каким образом если str это указатель.. char *str..

Тогда так напиши.. char str[256] вместо char *str
nazavrik
 Аватар для nazavrik
22 / 22 / 2
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:56  [ТС]     strcpy/strcpy_s #8
Цитата Сообщение от ISergey Посмотреть сообщение
Интересно каким образом если str это указатель.. char *str..

Тогда так напиши.. char str[256] вместо char *str
Ступил. Нужно просто переопределить указатель:

C++
1
2
3
4
5
6
7
    const_string(char const* s)
    {
        str = s;
        len = strlen(str);
    }
private:
    const char* str;
Но возникла другая проблема - создать объект const_string s(NULL);
insideone
Модератор
Автор FAQ
 Аватар для insideone
3622 / 900 / 47
Регистрация: 10.01.2010
Сообщений: 2,429
09.02.2010, 16:31     strcpy/strcpy_s #9
а можно вопрос про сам класс? вы собираетесь сделать класс строк данные которого нельзя было бы изменить?... мне кажется не выйдет.
В чем проблема создания пустой строки? Дополнительный if да и все. Кстати зачем делается len = strlen если далее не используется?
nazavrik
 Аватар для nazavrik
22 / 22 / 2
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 17:27  [ТС]     strcpy/strcpy_s #10
Цитата Сообщение от insideone Посмотреть сообщение
а можно вопрос про сам класс? вы собираетесь сделать класс строк данные которого нельзя было бы изменить?... мне кажется не выйдет.
В чем проблема создания пустой строки? Дополнительный if да и все. Кстати зачем делается len = strlen если далее не используется?
Отвечаю. Это упрощенный вид класса, где оставилась только та часть, в которой был вопрос. Get-методы в нем реализованы

Мне этот класс был нужен для следующего. Я перевел статью документации Boost.Test, где рассматривается такой класс - его тестируют на разные входные параметры, а ссылки на исходники битые, вот я и делал свою реализацию, чтобы проверить корректность рассматриваемых в статье тестов.
Плутон
13 / 13 / 4
Регистрация: 29.06.2011
Сообщений: 85
14.06.2012, 15:54     strcpy/strcpy_s #11
Возможно это не актуально, но я отвечу.

char* - это указатель на строку. Т.е. это переменная в один байт, в которой хранится адрес в оперативной памяти. Ты строку копируешь не в указатель, а в то место, куда он указывает(т. е. в кусок оперативной памяти, адрес начала которого хранится в указателе). Теперь важный момент: перед тем как использовать память, её нужно выделить, т. е. сказать операционной системе "Кусок памяти, на который указывает x размером n байт использует моя прога, и никакая другая!". Ваш указатель - не исключение. Вот правильный код класса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string.h>
 
class const_string
{
public:
    const_string(char const* s)
    {
        len = strlen(s);
        str = (char*)malloc(len+1);
        memset(str, '\0', len+1);
        strcpy(str, s);
    }
private:
    char *str;
    size_t len;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
14.06.2012, 17:47     strcpy/strcpy_s #12
Плутон, Феерично использовать с классами malloc. Браво!

Добавлено через 1 минуту
memset(str, '\0', len+1);
Абсолютно не нужен, при использовании далее strcpy. Т.к. да будет вам известно strcpy копирует до \0 (включительно).
Плутон
13 / 13 / 4
Регистрация: 29.06.2011
Сообщений: 85
14.06.2012, 21:51     strcpy/strcpy_s #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Плутон, Феерично использовать с классами malloc. Браво!
Привычка.

malloc выделяет память, не очищая её. Т.е. после выделения памяти инициализации нулём, как при new, не будет, и получится мусор.

Цитата Сообщение от ForEveR Посмотреть сообщение
Т.к. да будет вам известно strcpy копирует до \0 (включительно)
До нуля в какой строке?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.06.2012, 08:49     strcpy/strcpy_s #14
Плутон, В той из которой копируют, следовательно ту в которую копирует будет так же закрыта нулем, если размер строки из которой копируют не больше размера строки в которую копируют.
Плутон
13 / 13 / 4
Регистрация: 29.06.2011
Сообщений: 85
15.06.2012, 13:07     strcpy/strcpy_s #15
Цитата Сообщение от ForEveR Посмотреть сообщение
Плутон, В той из которой копируют, следовательно ту в которую копирует будет так же закрыта нулем, если размер строки из которой копируют не больше размера строки в которую копируют.
Извиняюсь, ошибся.

nazavrik, вот новый код класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string.h>
 
class const_string
{
public:
    const_string(char const* s)
    {
        len = strlen(s);
        str = new char[len+1];
        strcpy(str, s);
    }
private:
    char *str;
    size_t len;
};
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.06.2012, 16:34     strcpy/strcpy_s #16
Цитата Сообщение от Плутон Посмотреть сообщение
Т.е. после выделения памяти инициализации нулём, как при new, не будет, и получится мусор.
При new тоже не будет никакой инициализации для стандартных типов, если только этого не указать явно таким образом:
C++
1
char *str = new char [size]();
Плутон
13 / 13 / 4
Регистрация: 29.06.2011
Сообщений: 85
16.06.2012, 09:56     strcpy/strcpy_s #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
При new тоже не будет никакой инициализации для стандартных типов, если только этого не указать явно таким образом:
Знаю. Но как мы поняли, в данном случае она и не обязательна.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.06.2012, 10:02     strcpy/strcpy_s
Еще ссылки по теме:

C++ Выдает ошибку: error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead
C++ Ошибка error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead
C++ Работа с массивом с через strcpy_s()

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.06.2012, 10:02     strcpy/strcpy_s #18
Цитата Сообщение от Плутон Посмотреть сообщение
Знаю. Но как мы поняли, в данном случае она и не обязательна.
Тогда не вижу никаких причин для того, чтобы отдавать предпочтение malloc, а не new.
Yandex
Объявления
16.06.2012, 10:02     strcpy/strcpy_s
Ответ Создать тему
Опции темы

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