Gets в си не работает
Gets в си не работает
Gets в си не работает
Лучший отвечающий
Вопрос
1 #include «stdafx.h»
2
3 class isdelie <
4 char *name, *cipher;
5 int amount;
6 public:
7 void vvod() <
8 puts(«Enter the name:»);
9 fflush(stdin);
10 gets(name);
11 puts(«Enter the cipher:»);
12 fflush(stdin);
13 gets(cipher);
14 puts(«Enter the amount:»);
15 scanf_s(«%d», &amount);
16 >
17 void vivod() <
18
19 >
20 isdelie() <
21 >
22
23 >;
24
25 int _tmain(int argc, _TCHAR* argv[])
26 <
27
28 return 0;
29 >
Ошибка 1 error C4996: ‘gets’: This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
*ссылка на 10 строку*
Ответы
Учитесь делать все правильно, а не абы как.
Вы думали неверно, память выделяет тот кто вызывает функцию (типично и в данном случае). Но даже если бы память и выделялась бы, как бы вы получили на нее указатель? Ведь изменить переданный вами указатель невозможно, выходит что его передача вообще бесполезна.
Да, не на долго будет задействована «лишняя» память. Привыкайте, это обычное дело. Будете выделять память под максимальный ожидаемый размер строки, вот и все. Потом строка копируется по размеру или же сразу используется и память освобождается.
This posting is provided «AS IS» with no warranties, and confers no rights.
Все ответы
Дело в том что эта функция небезопасна и часто вызывает переполнение буфера что обычно приводит к AV. Вместо той функции следует использовать функцию gets_s (или fgets как вам уже посоветовали). Кстати, это написано в сообщении об ошибке, там же написано как запретить проверку.
Далее, вы забыли выделить память для ваших строк. Ваше приложение должно упасть с AV если вы его запретите проверку как написано в сообщении и компиляция пройдет успешно.
Еще один момент: не используйте char для символов/строк, это приводит к проблемам с локализацией. Используйте Unicode (WCHAR или TCHAR и функции для работы с ними). Для меня загадка почему в США (где нет проблем с местными символами) уже
20 лет как используют Unicode, а в России (где такие проблемы имеются) все упорно пытаются использовать 8 битные символы чтоб потом героически бороться с «квадратиками» и «иероглифами» вместо кириллицы.
This posting is provided «AS IS» with no warranties, and confers no rights.