Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
1

Warning: ‘char* gets(char*)’ is deprecated

10.05.2016, 12:06. Просмотров 1876. Ответов 19
Метки нет (Все метки)

Добрый день . встолкнулся с проблемой функции gets.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
char str [80];
 
cout <<"Введите строку: ";
gets(str);
cout <<"Вот ваша строка: ";
cout << str;
 
return 0;
}
После того как скомпилировал программу выдает ошибку -----
Кликните здесь для просмотра всего текста
program4.cpp: In function ‘int main()’:
program4.cpp:10:1: warning: ‘char* gets(char*)’ is deprecated [-Wdeprecated-declarations]
gets (str);
^
In file included from /usr/include/c++/5/cstdio:42:0,
from program4.cpp:2:
/usr/include/stdio.h:638:14: note: declared here
extern char *gets (char *__s) __wur __attribute_deprecated__;
^
program4.cpp:10:1: warning: ‘char* gets(char*)’ is deprecated [-Wdeprecated-declarations]
gets (str);
^
In file included from /usr/include/c++/5/cstdio:42:0,
from program4.cpp:2:
/usr/include/stdio.h:638:14: note: declared here
extern char *gets (char *__s) __wur __attribute_deprecated__;
^
program4.cpp:10:10: warning: ‘char* gets(char*)’ is deprecated [-Wdeprecated-declarations]
gets (str);
^
In file included from /usr/include/c++/5/cstdio:42:0,
from program4.cpp:2:
/usr/include/stdio.h:638:14: note: declared here
extern char *gets (char *__s) __wur __attribute_deprecated__;
^
/tmp/ccjT6ZUG.o: In function `main':
program4.cpp: (.text+0x2e): warning: the `gets' function is dangerous and should not be used.


помогите разобраться
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.05.2016, 12:06
Ответы с готовыми решениями:

Передача в функцию char*([Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings])
Почему компилятор на это матерится? ObjA.Show(&quot;A&quot;); deprecated conversion from string constant...

[Warning] deprecated conversion from string constant to 'char*'
В общем делаю классы, но не получается выводит ошибку. файл Selhoz.h #ifndef _SELHOZ_H_...

[Warning] deprecated conversion from string constant to 'char*'
Где ошибка?? #include&lt;iostream&gt; #include&lt;windows.h&gt; #include&lt;ctime&gt; using namespace std;...

Deprecated conversion from string constant to 'char*'
Подскажите,как записать чаровский массив и можно ли его вообще записать вроде: char *one =...

Deprecated conversion from string constant to 'char*'
Здраствуйте, помогите мне пожалуйста! Объясните в чем проблема #include&lt;stdlib.h&gt; #include...

19
jurok_85
275 / 258 / 190
Регистрация: 21.02.2013
Сообщений: 617
Завершенные тесты: 1
10.05.2016, 12:44 2
вместо gets, cin>>str; или cin.getline(str,80);
1
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
10.05.2016, 13:13  [ТС] 3
jurok_85, Уважаемый , я знаю что вместо gets() , Я могу использовать "cin >> str;" Но все же спасибо за ответ
0
Croessmah
++Ͻ
15315 / 8688 / 1659
Регистрация: 27.09.2012
Сообщений: 21,414
Записей в блоге: 2
Завершенные тесты: 1
10.05.2016, 17:03 4
MRG_Serejka, gets удалена из языка C.
Используйте, например, fgets.
0
10.05.2016, 17:03
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
10.05.2016, 21:03  [ТС] 5
Croessmah, а не могли бы вы показать как в моей программе заменить gets на fgets ?
А то я пока новичок, не знаю как использовать эту функцию.
0
Croessmah
++Ͻ
15315 / 8688 / 1659
Регистрация: 27.09.2012
Сообщений: 21,414
Записей в блоге: 2
Завершенные тесты: 1
11.05.2016, 05:52 6
C++
1
fgets(str, 80, stdin);
Но почему не использовать getline?
Зачем эта смесь из средств C и C++?
0
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
11.05.2016, 20:47  [ТС] 7
Croessmah,

т.е. должно быть вот так ? или я не туда вставил ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <cstdio>
using namespace std;
 
int main() 
{
char str [80];
 
cout <<"Введите строку: ";
fgets(str, 80, stdin);
cout <<"Вот ваша строка: ";
cout << str;
 
return 0;
}
Добавлено через 24 минуты
Croessmah, точно, работает)) Спасибо !
Только не пойму кое-что:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
 
{
char str [10];
cout << "Введите строку: ";
fgets(str, 10, stdin); // Считываем строку с клавиатуры.
cout << "Вот ваша строка: ";
cout << str;
return 0;
}
А что делает fgets(str, 10, stdin) в этой фунции ? Что если вместо 10 я введу 20 например ?
0
Croessmah
++Ͻ
15315 / 8688 / 1659
Регистрация: 27.09.2012
Сообщений: 21,414
Записей в блоге: 2
Завершенные тесты: 1
11.05.2016, 21:26 8
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
А что делает fgets(str, 10, stdin) в этой фунции ?
Это размер буфера.
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
Что если вместо 10 я введу 20 например ?
Грабли.
1
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
12.05.2016, 09:54  [ТС] 9
Croessmah,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
 
{
char str [10];
cout << "Введите строку: ";
fgets(str, 500, stdin); // Считываем строку с клавиатуры.
cout << "Вот ваша строка: ";
cout << str;
return 0;
}
Размер буфера поставил 500, а размер количество элементов массива оставил 10.
Ввел слово 1234567890йцукенгшщз и оно вывело так же 1234567890йцукенгшщз
Как так ? ведь в массив можно только 10 элементов засунуть.
По идее должно было вывести только 123456789 разве нет ?

Добавлено через 12 часов 17 минут
Croessmah, вот еще одна программа. с применение fgets.

Код
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

bool password();

int main()
{
if (password()) cout <<"Вход запрещен. \n";
else cout <<"Вход разрешен.\n";
return 0;
}


bool password()
{
char s[80];
cout << "Введите пароль: ";
fgets (s,80,stdin);
if (strcmp(s,"12345"))
        {
        cout<<"Пароль действителен.\n";
        return false;
        }
return true;
}
почему .что бы я не вводил он некоректно работает? чтобы я не вводил он выводит значение false
0
nimazzzy
Заблокирован
12.05.2016, 10:29 10
Цитата Сообщение от MRG_Serejka Посмотреть сообщение
что бы я не вводил он некоректно работает? чтобы я не вводил он выводит значение false
Потому что тебе надо почитать, что возвращает strcmp. И все тут же встанет на свои места.
1
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
14.05.2016, 15:15  [ТС] 11
Croessmah,

Я не пойму почему, одна и та же программа работает с cin корректно, а с fgets некорректно.
А именно, если мы вводим правильный пароль то программа должна нас пускать.
Но от того что мы вводим по разному данные в массив, программа работает по разному.

Вот код программы с cin:
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
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
 
bool password();
 
int main()
{
if (password()) cout <<"Вход разрешен. \n";
else cout <<"Вход запрещен.\n";
return 0;
}
 
 
bool password()
{
 
char s[80];
cout << "Введите пароль: ";
cin >> s;
 
    if (!strcmp (s, "12345")){
    cout << "Пароль действителен.\n";
    return true;
    }
cout << "Пароль недействителен.\n";
return false;
 
}
И она при вводе пароля 12345 выводит корректное сообщение:
Введите пароль: 12345
Пароль действителен.
Вход разрешен.

А при вводе любого другого числа выводит корректное сообщение:
Введите пароль: 34434
Пароль недействителен.
Вход запрещен.


НО !!! С fgets все работает не правильно:
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
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool password();
 
int main()
{
setlocale(LC_ALL, "Russian");
if (password()) cout << "Вход разрешен. \n";
else cout << "Вход запрещен.\n";
return 0;
}
 
 
bool password()
{
 
char s[80];
cout << "Введите пароль: ";
fgets (s, 80, stdin);
 
    if (!strcmp (s, "12345")){
    cout << "Пароль действителен.\n";
    return true;
    }
cout << "Пароль недействителен.\n";
return false;
 
}
При вводе корректного пароля 12345 с использованием функции fgets:
Введите пароль: 12345
Пароль недействителен.
Вход запрещен.

А при вводе любого другого случайного числа все равно выводит такое же сообщение:
Введите пароль: 324
Пароль недействителен.
Вход запрещен.

По сути мы поменяли в коде только метод ввода данных в массив, почему же тогда сразу программа работает неправильно из-за этого ? Может есть нюанс работы с fgets или у нас компилятор неправильный ?

Пробовали кстати эти 2 программы скомпилировать и запустить в:
- Ubuntu + nano + "g++"
- Windows 10 + CodeBlocks + GNU GCC Complier

Одинаково некорректно работает fgets

Скажите пожалуйста, в чем дело ?
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
14.05.2016, 15:36 12
дело во внимательности
fgets записывает в буфер символ перевода строки. естественно, что "blablabla\n" != "blablabla"
1
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
14.05.2016, 15:40  [ТС] 13
retmas, а как убрать \n из буфера fgets?
Ну, чтобы при вводе пароля 12345 через fgets, имелось ввиду именно 12345 а не 12345\n
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
14.05.2016, 15:46 14
C
1
2
3
4
fgets (s, 80, stdin);
size_t nl_pos = strlen(s);
if(nl_pos)
    s[nl_pos - 1] = '\0';
1
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
14.05.2016, 15:48  [ТС] 15
retmas, а полегче никак ? Я просто недалеко по книге ушел, пока еще не знаю что такое size_t nlpos и т.п.
0
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
14.05.2016, 15:55 16
просто замените в буфере \n на \0

Добавлено через 5 минут
кстати, если у вас cin, то почему Сишная fgets, а не плюсовая getline?
1
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
14.05.2016, 16:04  [ТС] 17
retmas, просто замените в буфере \n на \0
Спасибо, заменили вашим кодом:
C++
1
2
3
4
5
6
7
8
1
2
3
4
fgets (s, 80, stdin);
size_t nl_pos = strlen(s);
if(nl_pos)
    s[nl_pos - 1] = '\0';
кстати, если у вас cin, то почему Сишная fgets, а не плюсовая getline?
В нашей книге мы вообще имеем дело с gets, мы не дошли еще до fgets или getline
Вложу фотографию страницы с книги с этой программой, посмотрите сами.
0
Миниатюры
Warning: ‘char* gets(char*)’ is deprecated  
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
14.05.2016, 16:10 18
в топку такую книгу
1
MRG_Serejka
15 / 15 / 8
Регистрация: 15.08.2013
Сообщений: 185
Завершенные тесты: 2
14.05.2016, 16:18  [ТС] 19
retmas, а какую книгу вы посоветуете ?
У меня есть такие в наличии (сейчас занимаемся по С++ Базовый курс, Герберт Шилдт)
0
Миниатюры
Warning: ‘char* gets(char*)’ is deprecated  
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
14.05.2016, 16:30 20
шилдта я не читал, но если там такой никчемный микс С и С++ - правильно делал (но это мое мнение)
керникан и ричи маст рид, но это чистый Си, не плюсы. что за другие книги я не разобрал. посмотрите в прикрепленную тему с литературой. там много книг и комментов вроде тоже.
0
14.05.2016, 16:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2016, 16:30

Ошибка: deprecated conversion from string constant to ‘char*’
8,2.cpp: In function ‘int main()’: 8,2.cpp:31:12: warning: deprecated conversion from string...

Исправить предупреждение deprecated conversion from string constant to 'char*'
Нужно вывести предложение без повторных вхождений слов. Нужно исправить предупреждение deprecated...

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...


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

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

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