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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 178, средняя оценка - 4.61
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
#1

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

10.08.2010, 13:14. Просмотров 26870. Ответов 22
Метки нет (Все метки)

Добрый день.
Словил странную проблему (компилятор 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;
}
Хотелось бы услышать соображения на этот счет
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2010, 13:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование strcpy_s (C++):

strcpy/strcpy_s - C++
Добрый вечер! Есть класс (упрощенно): class const_string { public: const_string(char const* s) { strcpy(str, s); /...

Недружелюбный 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); А...

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

Работа с массивом с через strcpy_s() - C++
Функция addBrackets принимает массив и преобразует его заключая в скобки . т.е. на на вход массив: text после преобразования: ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
10.08.2010, 13:18 #2
http://msdn.microsoft.com/en-us/libr...a9(VS.80).aspx
Параметр 1 - куда
Параметр 2 - сколько байт выделено для переноса (размер буфера)
Параметр 3 - откуда
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
10.08.2010, 13:20  [ТС] #3
Цитата Сообщение от Евгений М. Посмотреть сообщение
http://msdn.microsoft.com/en-us/libr...a9(VS.80).aspx
Параметр 1 - куда
Параметр 2 - сколько байт выделено для переноса (размер буфера)
Параметр 3 - откуда
Да описание я в курсе, вот только :
1.Откуда взять размер (sizeof(s) из кода не катит, сразу ошибка выпадает)
2.По описанию также должно копировать без параметра размер.

Вот и думаю.....
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
10.08.2010, 13:20 #4
LineStown, в Вашем случае функция strcpy() безопасна, т.к. память выделяется заведомо достаточного размера. Если размер буфера, в который копируется строка, ограничен - лучше использовать strncpy() ну или разбираться с мелкомягкими велосипедами... Можете не обращать внимание на предупреждение, ну или отключите его, если сильно смущает...
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
10.08.2010, 13:22  [ТС] #5
Цитата Сообщение от easybudda Посмотреть сообщение
LineStown, в Вашем случае функция strcpy() безопасна, т.к. память выделяется заведомо достаточного размера. Если размер буфера, в который копируется строка, ограничен - лучше использовать strncpy() ну или разбираться с мелкомягкими велосипедами... Можете не обращать внимание на предупреждение, ну или отключите его, если сильно смущает...
Спасибо, вот именно смущает т.к. свою функцию она выполняет
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
10.08.2010, 13:32 #6
LineStown, если хочешь научится писать код на С++, а не на VC++, тогда откажись от strcpy_s. юзай только то, что определено стандартом. strcpy_s - это чисто VC++ более безопасный вариант, но безопасный для говнокодеров. Те кто то точно знает, что пишут - свободно могут применять функции из стандарта.
0
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,511
Записей в блоге: 26
10.08.2010, 14:59 #7
Цитата Сообщение от Евгений М. Посмотреть сообщение
http://msdn.microsoft.com/en-us/libr...a9(VS.80).aspx
Параметр 1 - куда
Параметр 2 - сколько байт выделено для переноса (размер буфера)
Параметр 3 - откуда
Немного отвлечённый вопрос. А чем strcpy_s отличается от strncpy?
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
10.08.2010, 15:28 #8
Цитата Сообщение от Evg Посмотреть сообщение
А чем strcpy_s отличается от strncpy?
Кроме принадлежности последней к
Standard C Library
?
0
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,511
Записей в блоге: 26
10.08.2010, 16:01 #9
Я имел в виду по действию. Зачем микрософтеры сделали strcpy_s, когда есть стандартный strncpy?
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
10.08.2010, 16:17 #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 в том плане, на кого такая "безопасность" рассчитана...
источник мелкомягких знаний
0
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,511
Записей в блоге: 26
10.08.2010, 17:00 #11
Погоди. Так там два параметра или три? Из второго поста я так понял, что три. Я просто не знаток в Си++
0
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
10.08.2010, 17:04 #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
0
easybudda
Модератор
Эксперт CЭксперт С++
9622 / 5570 / 946
Регистрация: 25.07.2009
Сообщений: 10,695
10.08.2010, 17:09 #13
Цитата Сообщение от Evg Посмотреть сообщение
Погоди. Так там два параметра или три?
Она там перегружена - есть с тремя параметрами (от strncpy() отличается порядком следования аргументов и типом возвращаемого значения - вместо указателя на полученную строку возвращается код ошибки типа errno_t), а есть с двумя параметрами шаблонная - в неё размер принимающей строки из её определения передаётся...
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
10.08.2010, 17:32  [ТС] #14
Цитата Сообщение от easybudda Посмотреть сообщение
Она там перегружена - есть с тремя параметрами (от strncpy() отличается порядком следования аргументов и типом возвращаемого значения - вместо указателя на полученную строку возвращается код ошибки типа errno_t), а есть с двумя параметрами шаблонная - в неё размер принимающей строки из её определения передаётся...
Так вот если есть шаблонная на 2 параметра, то почему она не работает с 2-мя параметрами?
До этого менял в других программах (не могу найти их), то с 2-мя параметрами нормально работает.
0
Evg
Эксперт CАвтор FAQ
17802 / 6008 / 387
Регистрация: 30.03.2009
Сообщений: 16,511
Записей в блоге: 26
10.08.2010, 17:35 #15
Т.е. если немного переделать пример из поста #10

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

Просто я не очень втыкаю в смысл конструкции "char (&strDestination)[size]", но на Си для такого описания в точке вызова не было бы разницы между массивом и указателем
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2010, 17:35
Привет! Вот еще темы с ответами:

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

Подскажите, почему не работает 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; ...

Strcpy_s выдает ошибку buffer is too small - C++
Вот у меня есть пример простого кода, но почем-то в месте, где вызывается функция копирования, вылезает ошибка. Вроде все делаю правильно: ...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.08.2010, 17:35
Ответ Создать тему
Опции темы

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