Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/85: Рейтинг темы: голосов - 85, средняя оценка - 4.53
23 / 23 / 5
Регистрация: 17.09.2008
Сообщений: 130
1

strcpy/strcpy_s

09.02.2010, 00:28. Показов 17412. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!

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

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 строк конструктор без проверки на ""?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2010, 00:28
Ответы с готовыми решениями:

Разница между strcpy_s и strcpy?
Добрый день! Писал программу с использованием оператора strcpy. Компилятор выдал такое вот...

Чем отличаются функции strcpy и strcpy_s
Подскажите в чем отличаются функции: strcpy от strcpy_s, sprintf от sprintf_s, strcat от ...

Ошибка error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead
#include <iostream> #include <cstring> #include <fstream> #include<string> #include<iomanip> ...

Выдает ошибку: error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead
Уважаемые форумчане! У меня не работает программа. Все написано "вроде" правильно. Выдает ошибку:...

17
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 00:32 2
а что такое str? а что означает "/" в той же строчке?

я бы тоже ругался.
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
09.02.2010, 00:36 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;
}
1
23 / 23 / 5
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:39  [ТС] 4
Цитата Сообщение от novi4ok Посмотреть сообщение
а что такое str? а что означает "/" в той же строчке?
В данном случае эта наклонная палка показывает, что при использовании как отстоящего слева выражения, так и справа стоящего.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 00:41 5
Цитата Сообщение от nazavrik Посмотреть сообщение
В данном случае эта наклонная палка показывает, что при использовании как отстоящего слева выражения, так и справа стоящего.
новое слово в науке?
0
23 / 23 / 5
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:41  [ТС] 6
ISergey, спасибо. Но нужно обойтись без выделения памяти.
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
09.02.2010, 00:44 7
Цитата Сообщение от nazavrik Посмотреть сообщение
ISergey, спасибо. Но нужно обойтись без выделения памяти.
Интересно каким образом если str это указатель.. char *str..

Тогда так напиши.. char str[256] вместо char *str
0
23 / 23 / 5
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:56  [ТС] 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);
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
09.02.2010, 16:31 9
а можно вопрос про сам класс? вы собираетесь сделать класс строк данные которого нельзя было бы изменить?... мне кажется не выйдет.
В чем проблема создания пустой строки? Дополнительный if да и все. Кстати зачем делается len = strlen если далее не используется?
0
23 / 23 / 5
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 17:27  [ТС] 10
Цитата Сообщение от insideone Посмотреть сообщение
а можно вопрос про сам класс? вы собираетесь сделать класс строк данные которого нельзя было бы изменить?... мне кажется не выйдет.
В чем проблема создания пустой строки? Дополнительный if да и все. Кстати зачем делается len = strlen если далее не используется?
Отвечаю. Это упрощенный вид класса, где оставилась только та часть, в которой был вопрос. Get-методы в нем реализованы

Мне этот класс был нужен для следующего. Я перевел статью документации Boost.Test, где рассматривается такой класс - его тестируют на разные входные параметры, а ссылки на исходники битые, вот я и делал свою реализацию, чтобы проверить корректность рассматриваемых в статье тестов.
0
13 / 13 / 5
Регистрация: 29.06.2011
Сообщений: 85
14.06.2012, 15:54 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;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
14.06.2012, 17:47 12
Плутон, Феерично использовать с классами malloc. Браво!

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

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

Цитата Сообщение от ForEveR Посмотреть сообщение
Т.к. да будет вам известно strcpy копирует до \0 (включительно)
До нуля в какой строке?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.06.2012, 08:49 14
Плутон, В той из которой копируют, следовательно ту в которую копирует будет так же закрыта нулем, если размер строки из которой копируют не больше размера строки в которую копируют.
0
13 / 13 / 5
Регистрация: 29.06.2011
Сообщений: 85
15.06.2012, 13:07 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;
};
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
15.06.2012, 16:34 16
Цитата Сообщение от Плутон Посмотреть сообщение
Т.е. после выделения памяти инициализации нулём, как при new, не будет, и получится мусор.
При new тоже не будет никакой инициализации для стандартных типов, если только этого не указать явно таким образом:
C++
1
char *str = new char [size]();
1
13 / 13 / 5
Регистрация: 29.06.2011
Сообщений: 85
16.06.2012, 09:56 17
Цитата Сообщение от silent_1991 Посмотреть сообщение
При new тоже не будет никакой инициализации для стандартных типов, если только этого не указать явно таким образом:
Знаю. Но как мы поняли, в данном случае она и не обязательна.
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
16.06.2012, 10:02 18
Цитата Сообщение от Плутон Посмотреть сообщение
Знаю. Но как мы поняли, в данном случае она и не обязательна.
Тогда не вижу никаких причин для того, чтобы отдавать предпочтение malloc, а не new.
0
16.06.2012, 10:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2012, 10:02
Помогаю со студенческими работами здесь

Использование strcpy_s
Добрый день. Словил странную проблему (компилятор MVS2010) #include&lt;iostream&gt; #include&lt;cstring&gt;...

Strcat или strcpy_s
strcat(name, &quot; &quot;); strcat(lastname, &quot; &quot;); strcpy(name, (strcat(strcat(lastname, name),...

Недружелюбный strcpy_s и прочие *_s
Доброй ночи. Подскажите, если есть два char* , то как осуществить копирование одного в другой, их...

Не работает strcat_s с strcpy_s
strcat_s(strcpy_s(s3, sizeof(s1), s1),sizeof(s2), s2); Так не работает. strcpy_s(s3, sizeof(s1),...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru