Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

strcpy/strcpy_s - C++

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

Добрый вечер!

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2010, 00:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос strcpy/strcpy_s (C++):

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

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

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

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

Использование strcpy_s - C++
Добрый день. Словил странную проблему (компилятор MVS2010) #include<iostream> #include<cstring> using namespace std; class String...

Strcat или strcpy_s - C++
strcat(name, " "); strcat(lastname, " "); strcpy(name, (strcat(strcat(lastname, name), dlastname))); strcpy(nomergroup, strcat(v,...

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

я бы тоже ругался.
0
ISergey
Maniac
Эксперт С++
1377 / 888 / 54
Регистрация: 02.01.2009
Сообщений: 2,675
Записей в блоге: 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
nazavrik
22 / 22 / 2
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:39  [ТС] #4
Цитата Сообщение от novi4ok Посмотреть сообщение
а что такое str? а что означает "/" в той же строчке?
В данном случае эта наклонная палка показывает, что при использовании как отстоящего слева выражения, так и справа стоящего.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
09.02.2010, 00:41 #5
Цитата Сообщение от nazavrik Посмотреть сообщение
В данном случае эта наклонная палка показывает, что при использовании как отстоящего слева выражения, так и справа стоящего.
новое слово в науке?
0
nazavrik
22 / 22 / 2
Регистрация: 17.09.2008
Сообщений: 130
09.02.2010, 00:41  [ТС] #6
ISergey, спасибо. Но нужно обойтись без выделения памяти.
0
ISergey
Maniac
Эксперт С++
1377 / 888 / 54
Регистрация: 02.01.2009
Сообщений: 2,675
Записей в блоге: 1
09.02.2010, 00:44 #7
Цитата Сообщение от nazavrik Посмотреть сообщение
ISergey, спасибо. Но нужно обойтись без выделения памяти.
Интересно каким образом если str это указатель.. char *str..

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

Мне этот класс был нужен для следующего. Я перевел статью документации Boost.Test, где рассматривается такой класс - его тестируют на разные входные параметры, а ссылки на исходники битые, вот я и делал свою реализацию, чтобы проверить корректность рассматриваемых в статье тестов.
0
Плутон
13 / 13 / 4
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
14.06.2012, 17:47 #12
Плутон, Феерично использовать с классами malloc. Браво!

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

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

Цитата Сообщение от ForEveR Посмотреть сообщение
Т.к. да будет вам известно strcpy копирует до \0 (включительно)
До нуля в какой строке?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
15.06.2012, 08:49 #14
Плутон, В той из которой копируют, следовательно ту в которую копирует будет так же закрыта нулем, если размер строки из которой копируют не больше размера строки в которую копируют.
0
Плутон
13 / 13 / 4
Регистрация: 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
15.06.2012, 13:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2012, 13:07
Привет! Вот еще темы с ответами:

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

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

Call to undefined function 'strcpy_s' - C++
Использую C++Builder® 2009 при использовании strcpy_s выдает ошибку File1.cpp(10): E2268 Call to undefined function 'strcpy_s' ...

Подскажите, почему не работает strcpy_s() - C++
Вот код char *pcStr = &quot;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22&quot; ...


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

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

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