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

Использование strcpy_s - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 178, средняя оценка - 4.61
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
10.08.2010, 13:14     Использование strcpy_s #1
Добрый день.
Словил странную проблему (компилятор MVS2010)
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
#include<cstring>
using namespace std;
class String
{
private:
    char *stroka;
public:
    String()
    {
        stroka=new char[0];
    }
    String(char *s)
    {
        int LEN=strlen(s);
        stroka=new char[LEN+1];
        strcpy(stroka,s);//Вот сдесь идет warning на то, что бы использовать
//strcpy_s. Но при использовании вылетает ошибка. что нет прототипа функции с 2-мя параметрами.
//Вот я немного и озадачился
    }
    ~String()
    {  
        delete []stroka;
        cout << "Строка успешно удалена" << endl;
    }                               
    void print()
    {
        cout << stroka << endl;
    }
};
using namespace std;
int main()
{
    setlocale(LC_ALL,"Russian");
    String s("Точность превыше всего");
    s.print();
    return 0;
}
Хотелось бы услышать соображения на этот счет
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2010, 13:14     Использование strcpy_s
Посмотрите здесь:

strcpy/strcpy_s C++
Чем отличаются функции strcpy и strcpy_s C++
C++ Call to undefined function 'strcpy_s'
Подскажите, почему не работает strcpy_s() C++
Не работает strcat_s с strcpy_s C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
10.08.2010, 13:18     Использование strcpy_s #2
http://msdn.microsoft.com/en-us/libr...a9(VS.80).aspx
Параметр 1 - куда
Параметр 2 - сколько байт выделено для переноса (размер буфера)
Параметр 3 - откуда
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
10.08.2010, 13:20  [ТС]     Использование strcpy_s #3
Цитата Сообщение от Евгений М. Посмотреть сообщение
http://msdn.microsoft.com/en-us/libr...a9(VS.80).aspx
Параметр 1 - куда
Параметр 2 - сколько байт выделено для переноса (размер буфера)
Параметр 3 - откуда
Да описание я в курсе, вот только :
1.Откуда взять размер (sizeof(s) из кода не катит, сразу ошибка выпадает)
2.По описанию также должно копировать без параметра размер.

Вот и думаю.....
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.08.2010, 13:20     Использование strcpy_s #4
LineStown, в Вашем случае функция strcpy() безопасна, т.к. память выделяется заведомо достаточного размера. Если размер буфера, в который копируется строка, ограничен - лучше использовать strncpy() ну или разбираться с мелкомягкими велосипедами... Можете не обращать внимание на предупреждение, ну или отключите его, если сильно смущает...
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
10.08.2010, 13:22  [ТС]     Использование strcpy_s #5
Цитата Сообщение от easybudda Посмотреть сообщение
LineStown, в Вашем случае функция strcpy() безопасна, т.к. память выделяется заведомо достаточного размера. Если размер буфера, в который копируется строка, ограничен - лучше использовать strncpy() ну или разбираться с мелкомягкими велосипедами... Можете не обращать внимание на предупреждение, ну или отключите его, если сильно смущает...
Спасибо, вот именно смущает т.к. свою функцию она выполняет
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.08.2010, 13:32     Использование strcpy_s #6
LineStown, если хочешь научится писать код на С++, а не на VC++, тогда откажись от strcpy_s. юзай только то, что определено стандартом. strcpy_s - это чисто VC++ более безопасный вариант, но безопасный для говнокодеров. Те кто то точно знает, что пишут - свободно могут применять функции из стандарта.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
10.08.2010, 14:59     Использование strcpy_s #7
Цитата Сообщение от Евгений М. Посмотреть сообщение
http://msdn.microsoft.com/en-us/libr...a9(VS.80).aspx
Параметр 1 - куда
Параметр 2 - сколько байт выделено для переноса (размер буфера)
Параметр 3 - откуда
Немного отвлечённый вопрос. А чем strcpy_s отличается от strncpy?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.08.2010, 15:28     Использование strcpy_s #8
Цитата Сообщение от Evg Посмотреть сообщение
А чем strcpy_s отличается от strncpy?
Кроме принадлежности последней к
Standard C Library
?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
10.08.2010, 16:01     Использование strcpy_s #9
Я имел в виду по действию. Зачем микрософтеры сделали strcpy_s, когда есть стандартный strncpy?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.08.2010, 16:17     Использование strcpy_s #10
Цитата Сообщение от Evg Посмотреть сообщение
Я имел в виду по действию. Зачем микрософтеры сделали strcpy_s, когда есть стандартный strncpy?
Ну вот такого
C++
1
2
3
4
5
template <size_t size>
errno_t strcpy_s(
   char (&strDestination)[size],
   const char *strSource 
); // C++ only
про strncpy() точно не написано. Это типа хитро перегруженная функция, которую можно вот так вызывать:
C++
1
2
3
   char string[80];
   // using template version of strcpy_s
   strcpy_s( string, "Hello world from " );
и вроде ничего можно не бояться.
Но тут по-моему прав Monte-Cristo в том плане, на кого такая "безопасность" рассчитана...
источник мелкомягких знаний
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
10.08.2010, 17:00     Использование strcpy_s #11
Погоди. Так там два параметра или три? Из второго поста я так понял, что три. Я просто не знаток в Си++
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
10.08.2010, 17:04     Использование strcpy_s #12
Evg, там две перегруженных функции:

C++
1
2
3
4
5
6
7
8
9
10
11
errno_t strcpy_s(
   char *strDestination,
   size_t numberOfElements,
   const char *strSource 
);
 
template <size_t size>
errno_t strcpy_s(
   char (&strDestination)[size],
   const char *strSource 
); // C++ only
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.08.2010, 17:09     Использование strcpy_s #13
Цитата Сообщение от Evg Посмотреть сообщение
Погоди. Так там два параметра или три?
Она там перегружена - есть с тремя параметрами (от strncpy() отличается порядком следования аргументов и типом возвращаемого значения - вместо указателя на полученную строку возвращается код ошибки типа errno_t), а есть с двумя параметрами шаблонная - в неё размер принимающей строки из её определения передаётся...
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
10.08.2010, 17:32  [ТС]     Использование strcpy_s #14
Цитата Сообщение от easybudda Посмотреть сообщение
Она там перегружена - есть с тремя параметрами (от strncpy() отличается порядком следования аргументов и типом возвращаемого значения - вместо указателя на полученную строку возвращается код ошибки типа errno_t), а есть с двумя параметрами шаблонная - в неё размер принимающей строки из её определения передаётся...
Так вот если есть шаблонная на 2 параметра, то почему она не работает с 2-мя параметрами?
До этого менял в других программах (не могу найти их), то с 2-мя параметрами нормально работает.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
10.08.2010, 17:35     Использование strcpy_s #15
Т.е. если немного переделать пример из поста #10

C++
1
2
char *string = new char[80];
strcpy_s( string, "Hello world from " );
то работать не будет?

Просто я не очень втыкаю в смысл конструкции "char (&strDestination)[size]", но на Си для такого описания в точке вызова не было бы разницы между массивом и указателем
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
10.08.2010, 17:41     Использование strcpy_s #16
Цитата Сообщение от Evg Посмотреть сообщение
Просто я не очень втыкаю в смысл конструкции "char (&strDestination)[size]"
Эта конструкция позволяет компилятору получить информацию о размере статического массива:
C++
1
2
3
4
5
template<size_t n>
void func(int (&arr)[n])
{
    std::cout << n << std::endl;
}
Если судить по объявлению, то здесь arr - это ссылка на массив из n элементов типа int
LineStown
 Аватар для LineStown
63 / 63 / 3
Регистрация: 04.08.2010
Сообщений: 399
10.08.2010, 17:47  [ТС]     Использование strcpy_s #17
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. если немного переделать пример из поста #10

C++
1
2
char *string = new char[80];
strcpy_s( string, "Hello world from " );
то работать не будет?

Просто я не очень втыкаю в смысл конструкции "char (&strDestination)[size]", но на Си для такого описания в точке вызова не было бы разницы между массивом и указателем

На такой код ошибка : error C2660: 'strcpy_s' : function does not take 2 arguments
Ладно, я думаю не имеет смысла продолжать искать логику мелкомягких, проше использовать стандарт.

Вот ещё подскажите как подавить сообщение об ошибке, что бы глаза не мозолило ?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.08.2010, 17:57     Использование strcpy_s #18
Цитата Сообщение от LineStown Посмотреть сообщение
Так вот если есть шаблонная на 2 параметра, то почему она не работает с 2-мя параметрами?
До этого менял в других программах (не могу найти их), то с 2-мя параметрами нормально работает.
с двумя параметрами будет работать только если принимающая строка будет объявлена, как char buf[SOME_SIZE] - тогда её размер будет вычисляться с помощью sizeof(). Если память под строку выделяется динамически - такой способ работать не будет.
Попробуйте выполнить следующий кусок кода
C++
1
2
3
4
char A[80];
char * B = new char[80];
cout << "size of A = " << sizeof(A) << endl;
cout << "size of B = " << sizeof(B) << endl;
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
10.08.2010, 17:58     Использование strcpy_s #19
Цитата Сообщение от Nameless One Посмотреть сообщение
Эта конструкция позволяет компилятору получить информацию о размере статического массива
Всё. Понял в чём соль. Не в том, чтобы использовать размер снаружи, а с тем, чтобы использовать его внутри. А снаружи просто берётся размер массива и подставляется параметром шаблона. В итоге эта хрень работает только для массивов с константыми размерами.

Действительно, гавнокод. Он удобен лишь до определённого предела, после которого родился strcpy_s с тремя параметрами
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2010, 18:00     Использование 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()

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

Или воспользуйтесь поиском по форуму:
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
10.08.2010, 18:00     Использование strcpy_s #20
Цитата Сообщение от LineStown Посмотреть сообщение
как подавить сообщение об ошибке
Ээээээ... Исправить.
Если Вы имели ввиду подавить сообщения об предупреждениях вызывайте компоновщик с параметром /w
Если Вы пишете на MSVC++ IDE (а не на блокноте) то откройте "Проект->Свойства->Компоновщик->Командная строка", в поле Доп. параметры добавьте /w
Yandex
Объявления
10.08.2010, 18:00     Использование strcpy_s
Ответ Создать тему
Опции темы

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