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

Error C4996: 'strcpy' - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
Pro100NoObik
0 / 0 / 0
Регистрация: 04.03.2014
Сообщений: 12
29.04.2014, 00:47     Error C4996: 'strcpy' #1
Проблема такая, есть код, который должен работать, но он не работает и выдаёт это: error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
вот код на С++(писал на MS VS:2013):
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
//main.cpp
 
#include <iostream>
#include "Triangle.h"
 
using namespace std;
 
 
 
int Menu();
int GetNumber(int, int);
void ExitBack();
void Show(Triangle* [], int);
void Move(Triangle* [], int);
void FindMax(Triangle* [], int);
void IsIncluded(Triangle* [], int);
double GetDouble ();
 
//Инициализация глобальных переменных
 
int Triangle::count = 0;
 
//главная функция
int main() 
{
    setlocale(0, "Russian");
    //определение точек
    Point p1(0, 0);
    Point p2(0.5, 1);
    Point p3(1, 0);
    Point p4(0, 4.5);
    Point p5(2, 1);
    Point p6(2, 0);
    Point p7(2, 2);
    Point p8(3, 0);
    
    //Определение треугольников
    Triangle triaA(p1, p2, p3, "triaA");
    Triangle triaB(p1, p4, p8, "triaB");
    Triangle triaC(p1, p5, p6, "triaC");
    Triangle triaD(p1, p7, p8, "triaA");
    
    //Определение массива указателей
    Triangle* pTria[] = {&triaA, &triaB, &triaC, &triaD}; //массив указателей с адресами объявленных треугольников
    int n = sizeof (pTria) / sizeof (pTria[0]); // его размер
    
    //главный цикл
    bool done = false;
    while (!done)
    {
        switch (Menu())
        {
            case 1: Show(pTria, n);
            break;
            case 2: Move(pTria, n);
            break;
            case 3: FindMax(pTria, n);
            break;
            case 4: IsIncluded(pTria, n);
            break;
            case 5: cout << "Конец работы" << endl;
            done = true;
            break;
        }
    }
 
    return 0;
}
 
//вывод меню
 
int Menu()
{
    cout << "\n==========Главное меню==========" << endl;
    cout << "1 - вывести все объекты" << endl;
    cout << "2 - переместить" << endl;
    cout << "3 - найти максимальный" << endl;
    cout << "4 - определить отношение включения" << endl;
    cout << "5 - выход" << endl;
    
    return GetNumber (1, 5);
}
 
//ввод целого числа  в заданном диапазоне
int GetNumber(int min, int max)
{
    int number = min - 1;
    while (true)
    {
        cin >> number;
        if ((number >= min) && (cin.peek() ==  '\n'))
            break;
        else
        {
            cout << "Повторите ввод (ожидается число от " << min << " до " << max << ")" << endl;
            cin.clear();
            while (cin.get() != '\n') {};
        }
    }
    return number;
}
 
//возврат в функцию с основным меню
void ExitBack()
{
    cout << "Нажмите Enter" << endl;
    cin.get();
    cin.get();
}
 
//вывод всех треугольников
void Show(Triangle* p_tria[], int k)
{
    cout << "=====Перечень треугольников====="  << endl;
    int i;
    for (i = 0; i < k; ++i) p_tria[i]->Show();
    //for (i = 0 ; i < k; ++i) p_tria[i]->ShowSideAndArea();
    ExitBack();
}
 
//функция ввода вещественного числа
double GetDouble ()
{
    double value;
    while (true)
    {
        cin >> value;
        if (cin.peek() == '\n')
            break;
        else
        {
            cout << "Повторите ввод (ожидается вещественное число);" << endl;
            cin.clear();
            while (cin.get() != '\n') {};
        }
    }
    return value;
}
 
//перемещение
void Move(Triangle* p_tria[], int k)
{
    cout << "=====Перемещение=====" << endl;
    cout << "Введите номер треугольника (от 1 до " << k << ");";
    int i = GetNumber(1, k) - 1;
    p_tria[i]->Show();
    
    Point dp;
    cout << "Введите смещение по x: ";
    dp.x = GetDouble();
    cout << "Введите смещение по y: ";
    dp.y = GetDouble();
    
    p_tria[i]->Move(dp);
    cout << "Новое положение треугольника: " << endl;
    p_tria[i]->Show();  
    ExitBack();
}
 
//поиск максимального треугольника
void FindMax(Triangle* p_tria[], int k)
{
    cout << "==Поиск максимального треугольника=="  << endl;
    //создаём объект triaMax, который по завершении поиска будет идентичен максимальному объекту.
    //инициализируем его значением 1-го объекта из массива объектов
    Triangle triaMax("triaMax");
    triaMax = *p_tria[0];
    //поиск
    for (int i = 1; i < 4; ++i)
        if (*p_tria[i] > triaMax)
            triaMax = *p_tria[i];
    cout << "Максимальный треугольник: " << triaMax.GetName() << endl;
    ExitBack();
}
 
//определение отношения включения
void IsIncluded(Triangle* p_tria[], int k)
{
    cout << "=====Отношение включения=====" << endl;
    
    cout << "Введите номер первого треугольника (от 1 до " << k << ");";
    int i1 = GetNumber(1, k) - 1;
    
    cout << "Введите номер второго треугольника (от 1 до " << k << ");";
    int i2 = GetNumber(1, k) - 1;
    
    if (TriaInTria(*p_tria[i1], *p_tria[i2]))
        cout << p_tria[i1]->GetName() << " входит в - " << p_tria[i2]->GetName() << endl;
    else
        cout << p_tria[i1]->GetName() << " не входит в - " << p_tria[i2]->GetName() << endl;
    
    ExitBack();
}
 
----------------------------------------------------------------
 
//Triangle.cpp
 
#include <math.h>
#include <iostream>
#include <iomanip>
#include <cstring>
#include "Triangle.h"
 
using namespace std;
 
//конструктор
Triangle::Triangle(Point _v1, Point _v2, Point _v3, const char* ident): v1(_v1), v2(_v2), v3(_v3)
{
    char buf[16];
    objID = new char[strlen(ident) + 1];
    strcpy(objID, ident);
    
    count++;
    sprintf(buf, "Треугольник %d", count);
    name = new char[strlen(buf) + 1];
    strcpy(name, buf);
    
    a = sqrt((v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y));
    b = sqrt((v2.x - v3.x) * (v2.x - v3.x) + (v2.y - v3.y) * (v2.y - v3.y));
    c = sqrt((v1.x - v3.x) * (v1.x - v3.x) + (v1.y - v3.y) * (v1.y - v3.y));
    cout << "Constructor_1 for: " << objID << " (" << name << ")" << endl; //отладочный вывод   
}
 
// конструктор пустого (нулевого) треугольника
Triangle::Triangle(const char* ident)
{
    char buf [16];
    objID = new char[strlen(ident) + 1];
    strcpy(objID, ident);
    
    count++;
    sprintf(buf, "Треугольник %d", count);
    name = new char[strlen(buf) + 1];
    strcpy(name, buf);
    a = b = c = 0;
    cout << "Constructor_2 for: " << objID << " (" << name << ")" << endl; //отладочный вывод   
}
 
//деструктор
Triangle::~Triangle()
{
    cout << "Destructor for: " << objID << endl;
    delete [] objID;
    delete [] name;
}
 
//показать объект
void Triangle::Show() const
{
    cout << name << ";";
    v1.Show(); 
    v2.Show(); 
    v3.Show();
    cout << endl;
}
 
//переместить объект на величину (dp.x, dp.y)
void Triangle::Move(Point dp)
{
    v1 += dp;
    v2 += dp;
    v3 += dp;
}
 
//сравнить объект по площади с объектом tria
bool Triangle::operator > (const Triangle& tria) const
{
    double p = (a + b + c) / 2;
    double s = sqrt(p * (p - a) * (p - b) * (p - c));
    double p1 = (tria.a + tria.b + tria.c) / 2;
    double s1 = sqrt(p1 * (p1 - tria.a) * (p1 - tria.b) * (p1 - tria.c));
    if (s > s1)
        return true;
    else
        return false;
}
 
//конструктор копирования
Triangle::Triangle(const Triangle& tria) : v1(tria.v1), v2(tria.v2), v3(tria.v3)
{
    cout << "Copy constructor for: " << tria.objID << endl; //отладочный вывод
    objID = new char[strlen(tria.objID) + strlen("(копия)") + 1];
    strcpy(objID, tria.objID);
    strcat(objID, "(копия)");
    
    name = new char[strlen(tria.name) + 1];
    strcpy(name, tria.name);
    a = tria.a;
    b = tria.b;
    c = tria.c;
}
 
//присвоить значение объекта tria
Triangle& Triangle::operator = (const Triangle& tria)
{
    cout << "Assign operator: " << objID << " = " << tria.objID << endl;
    //отладочный вывод
    
    if (&tria == this)
        return *this;
    delete [] name;
    name = new char[strlen(tria.name) + 1];
    strcpy(name, tria.name);
    a = tria.a;
    b = tria.b;
    c = tria.c;
    return *this;
}
 
//определить, входит ли треугольник tria1 в треугольник tria2
bool TriaInTria(Triangle tria1, Triangle tria2)
{
    Point v1 = tria1.Get_v1();
    Point v2 = tria1.Get_v2();
    Point v3 = tria1.Get_v3();
    return (v1.InTriangle(tria2) && v2.InTriangle(tria2) && v3.InTriangle(tria2));
    return true;
}
 
 
--------------------------------------------------
 
//Triangle.h
 
#ifndef TRIANGLE_H
#define TRIANGLE_H
 
#include "Point.h"
 
class Triangle 
{
    public:
        
        Triangle& operator = (const Triangle&);
        Triangle(const Triangle&); //конструктор копирования
        Triangle(Point, Point, Point, const char*); //конструктор
        Triangle(const char*); //конструктор пустого (нулевого) треугольника
        bool operator > (const Triangle&) const; //метод обеспечивающий сравнение треугольников по их площади
        ~Triangle(); //деструктор
        Point Get_v1() const { return v1; } //получить значение v1
        Point Get_v2() const { return v2; }
        Point Get_v3() const { return v3; }
        char* GetName() const { return name; } // получить имя объекта
        void Show() const; // показать объект, печатаются координаты его вершин
        void Move(Point);
        friend bool TriaInTria(Triangle, Triangle); //определить, входит ли  один треугольник во второй
    public:
        static int count; //количество созданных объектов//глобальный счётчик создаваемых объектов
        
    private:
        char* objID; // идентификатор объекта
        char* name; // наименование треугольника
        Point v1, v2, v3; //вершины
        double a; //сторона, соеденяющая v1 и v2
        double b; //v2 и v3
        double c; //v3 и v1     
};
#endif
 
--------------------------------------------
 
//Point.cpp
 
#include <iostream>
#include <math.h>
#include "Point.h"
#include "Triangle.h"
 
using namespace std;
 
void Point::Show() const
{
    cout << " (" << x << ", " << y << ")";
}
 
void Point::operator += (Point& p)
{
    x += p.x;
    y += p.y;
}
 
Point Point::operator +(Point& p)
{
    return Point(x + p.x, y + p.y);
}
 
Point Point::operator -(Point& p)
{
    return Point(x - p.x, y - p.y);
}
 
double Point::Length() const
{
    return sqrt(x*x + y*y);
}
 
ORIENT Point::Classify(Point& beg_p, Point& end_p) const
{
    Point p0 = *this;
    Point a = end_p - beg_p;
    Point b = p0 - beg_p;
    double sa = a.x * b.y - b.x * a.y;
    
    if (sa > 0.0)
        return LEFT;
    if (sa < 0.0)
        return RIGHT;
    if ((a.x * b.x < 0.0) || (a.y * b.y < 0.0))
        return BEHIND;
    if (a.Length() < b.Length())
        return BETWEEN;
}
 
bool Point::InTriangle(Triangle& tria) const
{
    Point p1 = tria.Get_v1();
    Point p2 = tria.Get_v2();
    Point p3 = tria.Get_v3();
    ORIENT or1 = Classify(p1, p2);
    ORIENT or2 = Classify(p2, p3);
    ORIENT or3 = Classify(p3, p1);
    
    
/*  ORIENT or1 = Classify(tria.Get_v1(), tria.Get_v2());
    ORIENT or2 = Classify(tria.Get_v2(), tria.Get_v3());
    ORIENT or3 = Classify(tria.Get_v3(), tria.Get_v1());*/
    
    if ((or1 == RIGHT || or1 == BETWEEN) && (or2 == RIGHT || or2 == BETWEEN) && (or3 == RIGHT || or3 == BETWEEN))
        return true;
    else
        return false;
}
 
 
-----------------------------------------------------------
 
//Point.h
 
#ifndef POINT_H
#define POINT_H
 
enum ORIENT {LEFT, RIGHT, AHEAD, BEHIND, BETWEEN}; // определяет целочисленные константы и присваивает им значения.
class Triangle;
 
class Point
{
    public:
        //конструктор
        Point(double _x = 0, double _y = 0) : x(_x), y(_y) {}
        //другие методы
        void Show() const; //единственный метод Show() // показать объект типа Point на экране
        void operator += (Point&); //объявление операции-функции += , которая позволит реализовать метод перемещения Move()
        Point operator +(Point&);
        Point operator -(Point&);
        double Length() const; // определяет длину вектора точки в полярной системе координат
        ORIENT Classify(Point&, Point&) const; //определяет положение точки относительно вектора заданного двумя точками
        bool InTriangle(Triangle&) const; //определяет, находится ли точка внутри треугольника
    public: //поля = переменные, методы = функции
        double x, y;
};
#endif
помогите подправить эту strcpy, а то совсем уже капец
сразу скажу что strncpy, strcpy_s не работают, а при подключении макросов программа вообще не хочет компилиться и так же выдаёт ошибки

Добавлено через 1 минуту
и ещё одно предупреждение, его так же надо убрать
warning C4715: Point::Classify: значение возвращается не при всех путях выполнения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
29.04.2014, 00:49     Error C4996: 'strcpy' #2
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
сразу скажу что strncpy, strcpy_s не работают
что значит не работает? не компилируется? или не верный результат?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
29.04.2014, 00:53     Error C4996: 'strcpy' #3
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead.To disable deprecation,use _CRT_SECURE_NO_WARNINGS. See online help for details.
а прочитать никак уж?

Добавлено через 42 секунды
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
а при подключении макросов программа вообще не хочет компилиться и так же выдаёт ошибки
мы гадать должны что за ошибки?
cooller
 Аватар для cooller
564 / 532 / 120
Регистрация: 25.12.2013
Сообщений: 1,456
29.04.2014, 00:53     Error C4996: 'strcpy' #4
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
warning C4715: Point::Classify: значение возвращается не при всех путях выполнения
потому что компилятор думает: "а что мне возвращать, если ни одна из веток ифа не будет истинной?"
IrineK
Заблокирован
29.04.2014, 00:54     Error C4996: 'strcpy' #5
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
error C4996: 'strcpy'
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
strncpy, strcpy_s не работают
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
при подключении макросов программа вообще не хочет компилиться
Ну раз прямо вот так - откажитесь от строк char в пользу string.
Там делов то - на пару минут.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
29.04.2014, 00:54     Error C4996: 'strcpy' #6
Цитата Сообщение от Pro100NoObik Посмотреть сообщение
и ещё одно предупреждение, его так же надо убрать
warning C4715: Point::Classify: значение возвращается не при всех путях выполнения
а здесь вообще русским языком написано!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ORIENT Point::Classify(Point& beg_p, Point& end_p) const
{
    Point p0 = *this;
    Point a = end_p - beg_p;
    Point b = p0 - beg_p;
    double sa = a.x * b.y - b.x * a.y;
    
    if (sa > 0.0)
        return LEFT;
    if (sa < 0.0)
        return RIGHT;
    if ((a.x * b.x < 0.0) || (a.y * b.y < 0.0))
        return BEHIND;
    if (a.Length() < b.Length())
        return BETWEEN;
}
если не одно из условий не выполнится, то как делать возврат?
Yandex
Объявления
29.04.2014, 00:54     Error C4996: 'strcpy'
Ответ Создать тему
Опции темы

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