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

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

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

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

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

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

Не работает 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); А...

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

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 и strcpy? - C++
Добрый день! Писал программу с использованием оператора strcpy. Компилятор выдал такое вот предупреждение: error C4996: 'strcpy':...

Работа с массивом с через 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' ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
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
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
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
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
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
Эксперт CАвтор FAQ
17545 / 5783 / 370
Регистрация: 30.03.2009
Сообщений: 15,930
Записей в блоге: 26
10.08.2010, 17:58     Использование strcpy_s #19
Цитата Сообщение от Nameless One Посмотреть сообщение
Эта конструкция позволяет компилятору получить информацию о размере статического массива
Всё. Понял в чём соль. Не в том, чтобы использовать размер снаружи, а с тем, чтобы использовать его внутри. А снаружи просто берётся размер массива и подставляется параметром шаблона. В итоге эта хрень работает только для массивов с константыми размерами.

Действительно, гавнокод. Он удобен лишь до определённого предела, после которого родился strcpy_s с тремя параметрами
Евгений М.
1035 / 976 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
10.08.2010, 18:00     Использование strcpy_s #20
Цитата Сообщение от LineStown Посмотреть сообщение
как подавить сообщение об ошибке
Ээээээ... Исправить.
Если Вы имели ввиду подавить сообщения об предупреждениях вызывайте компоновщик с параметром /w
Если Вы пишете на MSVC++ IDE (а не на блокноте) то откройте "Проект->Свойства->Компоновщик->Командная строка", в поле Доп. параметры добавьте /w
easybudda
Эксперт CЭксперт С++
9468 / 5481 / 927
Регистрация: 25.07.2009
Сообщений: 10,505
10.08.2010, 18:12     Использование strcpy_s #21
Цитата Сообщение от LineStown Посмотреть сообщение
Вот ещё подскажите как подавить сообщение об ошибке, что бы глаза не мозолило ?
C++
1
#pragma warning( disable: четырёхзначный_код_предупреждения )
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
10.08.2010, 18:17  [ТС]     Использование strcpy_s #22
Спасибо всем огромное за пояснение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2016, 23:59     Использование 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; ...

Как передать динамический массив в strcpy_s? - C++
Всем привет, такая проблема: не могу передать динамический массив в функцию strcpy_s, компилятор ошибок не видит, а после исполнения пишет,...

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

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

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


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

Или воспользуйтесь поиском по форуму:
Torovich
0 / 0 / 0
Регистрация: 29.11.2016
Сообщений: 20
20.12.2016, 23:59     Использование strcpy_s #23
Так мне получается изначально нужен был размер массива вместо длины строки
для функции копирования с обрезанием.
C++
1
strncpy_s(s1, sizeof(s1), s2, sizeof(s1) - 1);
Так все отлично.
(Длина s2 больше s1)
Yandex
Объявления
20.12.2016, 23:59     Использование strcpy_s
Ответ Создать тему
Опции темы

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