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

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

Войти
Регистрация
Восстановить пароль
 
Xerasima
0 / 0 / 0
Регистрация: 23.10.2015
Сообщений: 30
#1

Обяснить почему компилятор пишет, что функция gets() небезопасна - C++

27.12.2015, 21:38. Просмотров 352. Ответов 4
Метки нет (Все метки)

Проблемка с gets(s),пишет функция не безопасна и не компилирует,как это исправить
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
#include <iostream> 
#include <fstream>
#include <stdio.h>
 
using namespace std; 
struct Adr {
    char name[30];
    char street[40]; 
    char city[20];
    struct Adr *next;
    struct Adr *prev; }; 
    struct Adr *head; 
    struct Adr *last;
    int Menu(void) {
        char s[80]; 
        int c; 
        cout<<endl; 
        cout<<"1. Ввод имени"<<endl; 
        cout<<"2. Удаление имени"<<endl; 
        cout<<"3. Вывод перечня на экран"<<endl;
        cout<<"4. Поиск"<<endl; 
        cout<<"5. Сохранить в файл"<<endl;
        cout<<"6. Загрузить из файла"<<endl;
        cout<<"7. Выход"<<endl; cout<<endl;
        do {
            cout<<"Ваш выбор: "; 
            gets(s); 
            cout<<endl; 
            c = atoi(s); 
        } 
        while(c<0 || c>7);
        return c; 
    } 
    void Sozdat(Adr *i, Adr **head, Adr **last) {
        struct Adr *old, 
            *p; 
        if(*last==NULL) { 
            i->next = NULL;
            i->prev = NULL; 
            *last = i;
            *head = i; 
            return; 
        }
        p = *head;
        old = NULL;
        while(p) { 
            if(strcmp(p->name, i->name)<0) {
                old = p; p = p->next; 
            } else { 
                if(p->prev) {
                    p->prev->next = i;
                    i->next = p;
                    i->prev = p->prev;
                    p->prev = i; return;
                }
                i->next = p;
                i->prev = NULL;
                p->prev = i;
                *head = i;
                return;
            } 
        } old->next = i;
        i->next = NULL;
        i->prev = old; 
        *last = i;
    } 
    void Vvod(char *prompt, char *s, int count) { 
        char p[255]; 
        do {
            cout<<(prompt);
            fgets(p, 254, stdin);
            if(strlen(p) > count)
                cout<<("Очень длинноватая строчка"); 
        }
        while(strlen(p) > count);
        p[strlen(p)-1] = 0;
        strcpy(s, p);
    } 
    void VvodSp(void)// Ввод строчки
    { 
        struct Adr *t;
        int i;
        t = new (struct Adr);
        if(!t) { 
            cout<<("Нет вольной памяти");
            return; 
        }
        Vvod("Введите имя: ", t->name, 30);
        Vvod("Введите улицу: ", t->street, 40);
        Vvod("Введите город: ", t->city, 20);
        Sozdat(t, &head, &last);
    } 
    void VyvodSp(void)//Перечень на экран 
    {
        struct Adr *t; 
        t = head;
        while(t) {
            cout<< t->name<< ' ' << t->street << ' ' << t->city<<endl; t = t->next; } cout<<""<<endl; 
    }
    void Poisk(void)// Поиск имени в перечне 
    {
        char name[40]; 
        struct Adr *t; 
        t = head; 
        cout<<"Введите имя: ";
        gets(name); 
        while(t) {
            if(!strcmp(name, t->name)) break;
            t = t->next;
        }
        if(!t)
            cout<<"Имя не найдено"<<endl;
        else cout << t->name << ' ' << t->street << ' ' << t->city<<endl;
    } void Udalit( Adr **head, Adr **last) {
        struct Adr *t; 
        char name[40];
        t = *head;
        cout<<"Введите имя: ";
        gets(name);
        while(t) {
            if(!strcmp(name, t->name)) break;
            t = t->next;
        } if(t){ if(*head==t) { 
            *head=t->next;
        if(*head) (*head)->prev = NULL;
        else *last = NULL; 
        }
        else { 
            t->prev->next = t->next;
            if(t!=*last) t->next->prev = t->prev; 
            else *last = t->prev;
        } delete t; 
        } 
    }
    void Zapisat(void)//Запись в файл
    { struct Adr *t; 
    FILE *fp; fp = fopen("mlist", "wb");
    if(!fp) {cout<<"Файл не раскрывается"<<endl;
    exit(1); 
    } 
    cout<<"Сохранение в файл"<<endl;
    t = head; while(t) {fwrite(t, sizeof(struct Adr), 1, fp);
    t = t->next; 
    }
    fclose(fp);
    }
    void Schitat()//Считыв. из файла
    { 
        struct Adr *t;
        FILE *fp;
        fp = fopen("mlist", "rb");
        if(!fp) {
            cout<<"Файл не раскрывается"<<endl;
            exit(1); 
        }
        while(head) {last = head->next;
        delete head; head = last;
        } 
        head = last = NULL;
        cout<<"Загрузка из файла"<<endl;
        while(!feof(fp)) {
            t = new (struct Adr);
            if(!t) {cout<<"Нет вольной памяти"<<endl;
            return; 
            }
            if(1 != fread(t, sizeof(struct Adr), 1, fp)) break;
            Sozdat(t, &head, &last);
        } fclose(fp);
    } int main(void) { 
        setlocale (LC_CTYPE, "Rus");
        head = last = NULL
            ; for(;;) { 
            switch(Menu()) {
            case 1: VvodSp();
                break; 
            case 2: Udalit(&head, &last);
                break; 
            case 3: VyvodSp();
                break; 
            case 4: Poisk();
                break; 
                case 5: Zapisat();
                break;
                case 6: Schitat();
                    break; 
                case 7: exit(0); 
            } 
        } 
        return 0; 
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2015, 21:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обяснить почему компилятор пишет, что функция gets() небезопасна (C++):

компилятор пишет что не может найти модуль graphics - C++
мне нада написать програму на с++, которая рисует две прямые, но мой компилятор пишет что не может найти модуль graphics. что мне...

Почему пишет, что не определена точка входа? - C++
#include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;clocale&gt; #include &lt;windows.h&gt; #ifndef...

Почему-то игнорируется эта функция, другие работают. Что не так? - C++
void boat::atack() { srand(static_cast &lt;unsigned int&gt;(time(0))); std::cout &lt;&lt; &quot;Нажмите любую клавишу для начала боя!&quot;; _getch();...

Почему компиллятор выдает ошибку и не хочет что бы функция принимала 2 переменных - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;conio.h&gt; using namespace std; int funk( int a, int b) ...

Что и почему дописать в int main() чтобы функция void вернула значение - C++
Что и почему дописать в int main() чтобы функция void вернула значение? #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;iostream.h&gt;...

Почему не пишет файл? - C++
int main (int Count , char **Parametrs) { std::ofstream s; s.open(&quot;C:\Projects\test\s.log&quot;); s&lt;&lt;&quot;tfds&quot;; ...

4
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
27.12.2015, 21:52 #2
Xerasima, ну в предупреждении же наверное написано вместо gets использовать gets_s?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
27.12.2015, 21:52 #3
Цитата Сообщение от Xerasima Посмотреть сообщение
пишет функция не безопасна
в студии чтоли?
Цитата Сообщение от Xerasima Посмотреть сообщение
как это исправить
так там же дальше и написано что сделать.
0
gru74ik
Эксперт CЭксперт С++
4207 / 1853 / 198
Регистрация: 20.02.2013
Сообщений: 4,992
Записей в блоге: 22
27.12.2015, 21:54 #4
Xerasima, функция устарела и ею не рекомендуется пользоваться:
The most recent revision of the C standard (2011) has definitively removed this function from its specification.
The function is deprecated in C++ (as of 2011 standard, which follows C99+TC3).
0
nord_v
228 / 177 / 69
Регистрация: 22.08.2013
Сообщений: 724
27.12.2015, 22:49 #5
Цитата Сообщение от Xerasima Посмотреть сообщение
как это исправить
Security Development Lifecyde (SDL)
Как отключить в свойствах проекта:
Ошибка в SCANF

Или, выше всех инклудов, прописать: #define _CRT_SECURE_NO_WARNINGS (для getch() не сработает, нужно менять на _getch()).

Или ниже всех инклудов прописать: #pragma warning(disable : 4996)
0
27.12.2015, 22:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2015, 22:49
Привет! Вот еще темы с ответами:

почему пишет требуется идентификатор? - C++
class Homeworklist { private: int current_size; public: vector&lt;Homework&gt; list; Homeworklist(){current_size = 0;} ...

Почему компилятор ругается? - C++
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;conio.h&gt; using namespace std; FILE*fp; struct Computer { char...

Почему не работает компилятор - C++
ввожу самый простой код, а он мне выдает: 1&gt;------ Построение начато: проект: дд, Конфигурация: Release Win32 ------ 1&gt;Компиляция... ...

Почему ругается компилятор - C++
#include &lt;iostream&gt; using namespace std; int main() { int a; cin.get(a); system(&quot;pause&quot;); }


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

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

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