Почему не работает gets c
Почему вот в таком коде:
#include #include #include using namespace std; int main() < short x; char s[100]; cin >> x; gets(s); cout
после считывания переменной x не работает функция gets()? При этом в итоге выводится пустая строка s.
Последний раз редактировалось merax; 29.07.2008 в 06:37 .
Меркантильный кю
Участник клуба
Регистрация: 02.02.2008
Сообщений: 1,001
Когда ты вот здесь
cin >> x;
вбиваешь число и щёлкаешь Энтер, считывается только число, а символ перевода строки остаётся в буфере клавиатуры. Функция же gets() считывает как раз до этого символа, поэтому в твоей строке есть только символ перевода строки
Как вариант, вызывай перед gets getchar(). Или можно ввод x организовать по-другому
Росли вроде умными, выросли дурнями. (c)А.Васильев
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не работает функция keybd_event | Hintman | Win Api | 31 | 05.06.2011 14:16 |
Функция Tregistry.keyexists не работает | Ozerich | Общие вопросы Delphi | 5 | 18.09.2008 09:42 |
Не работает функция floor в Java | POPOV | Помощь студентам | 1 | 24.04.2008 14:08 |
одна функция потока, а другая функция — член класса запускающего этот поток | Дмитрий_Ч | Общие вопросы C/C++ | 2 | 27.09.2007 08:50 |
не корректно работает функция «если» (+) | zetrix | Microsoft Office Excel | 0 | 30.10.2006 19:19 |
проблема с функцией gets()
Из-за чего могут быть проблемы с функцией gets() ? Тестирующая система выдает такую ошибку: Content-type: text/xml 45a5b2ff-e647-482e-b475-39768bf61a7e 003839.cpp: In function ‘int main()’: 003839.cpp:17:16: error: ‘gets’ was not declared in this scope while (gets(s)) ^ Так выглядит часть моего кода, где используется gets()
int main() < const char* sep = ". -,;() \t\n"; ifstream file; file.open("input.in"); file.open("output.out"); while (gets(s)) < if (!s[0]) break; // >
Отслеживать
задан 2 янв 2018 в 9:39
Julia Ponomareva Julia Ponomareva
305 5 5 серебряных знаков 16 16 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Неплохо бы посмотреть весь код. Наверное, забыли нужный #include — stdio.h — или компилятор из свежайших, в котором эту функцию уже выбросили.
В любом случае, использовать gets крайне не рекомендуется. Замените на gets_s .
Отслеживать
ответ дан 2 янв 2018 в 9:53
12.6k 2 2 золотых знака 19 19 серебряных знаков 44 44 бронзовых знака
gets_s не обязателен для реализации. Замена gets — fgets.
2 янв 2018 в 9:58
вот весь код pastebin.com/tgrA4YG4, stdio.h был подключен
2 янв 2018 в 10:01
Это не тот код — по ссылке у вас fgets , а не gets ! Вы случаем не Visual C++ 2015 или 2017 компилируете? Если заменить fgets на gets — да, эти компиляторы не компилируют — потому что gets из стандарта давно выброшен. А вот VC++ 2010 спокойно компилирует — предупреждая о небезопасности.
2 янв 2018 в 12:03
Я просто поменяла на gets. У меня dev c++, всё компилируется, но на информатиксе (тест. система) выдает ошибку
2 янв 2018 в 12:27
Функция gets была удалена в стандарте C++14 из за ее крайней небезопасности. Она подвержена проблеме переполнения буфера, так как размер буфера в ней никак не указывается. Используйте ::std::string s в качестве буфера и file >> s для чтения. Кроме того, после записи file.open(«output.out»); чтение будет производится из файла output.txt .
Отслеживать
ответ дан 2 янв 2018 в 10:22
user7860670 user7860670
29.8k 3 3 золотых знака 17 17 серебряных знаков 36 36 бронзовых знаков
Не могли бы Вы проиллюстрировать на моем коде? Не очень понимаю, как интегрировать данную конструкцию
gets , _getws
Получает строку из потока stdin . Доступны более безопасные версии этих функций; see gets_s , _getws_s .
Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT. Безопасные версии этих функций gets_s и _getws_s по-прежнему доступны. Дополнительные сведения об этих альтернативных функциях см. в разделе gets_s . _getws_s
Этот API нельзя использовать в приложениях, выполняемых в среде выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.
Синтаксис
char *gets( char *buffer ); wchar_t *_getws( wchar_t *buffer ); template char *gets( char (&buffer)[size] ); // C++ only template wchar_t *_getws( wchar_t (&buffer)[size] ); // C++ only
Параметры
buffer
Место хранения входной строки.
Возвращаемое значение
В случае успеха возвращает свой аргумент. Указатель NULL указывает на ошибку или конец файла. Используйте ferror или feof определите, какой из них произошел. Если buffer это NULL так, эти функции вызывают недопустимый обработчик параметров, как описано в разделе «Проверка параметров». Если продолжение выполнения разрешено, эти функции возвращают NULL и устанавливают для errno значение EINVAL .
Замечания
Функция gets считывает строку из стандартного потока ввода stdin и сохраняет ее в буфере buffer . Строка состоит из всех символов до первого символа новой строки («\n»). Затем перед возвратом строки функция gets заменяет символ новой строки нуль-символом («\0»). Напротив, функция fgets сохраняет символ новой строки. _getws — это версия функции gets для расширенных символов; ее аргумент и возвращаемое значение являются строками расширенных символов.
Так как количество символов, считываемых ненадежными gets , может легко привести к переполнению буфера. Вместо этого используйте fgets .
В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые и безопасные аналоги этих функций. Дополнительные сведения см. в разделе «Безопасные перегрузки шаблонов».
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью «Глобальное состояние» в CRT.
Сопоставления подпрограмм универсального текста
Подпрограмма TCHAR.H | _UNICODE и _MBCS не определен | _MBCS Определенные | _UNICODE Определенные |
---|---|---|---|
_getts | gets | gets | _getws |
Требования
Маршрут | Обязательный заголовок |
---|---|
gets | |
_getws | или |
Дополнительные сведения о совместимости см. в разделе Совместимость.
Пример
// crt_gets.c // compile with: /WX /W3 #include int main( void ) < char line[21]; // room for 20 chars + '\0' gets( line ); // C4996 // Danger: No way to limit input to 20 chars. // Consider using gets_s instead. printf( "The line entered was: %s\n", line ); >
Входные данные дольше 20 символов перезапустят буфер строки и почти наверняка вызывают сбой программы.
Hello there!The line entered was: Hello there!
Функция gets() в C?
Здравствуйте, почему при выполнении программы не выполняется 3 gets? Первые два работают нормально, но когда доходит до 3, он не выполняется и длина выводится 0?
При этом, если закомментировать первую часть программы до char message[255], gets() выполняется и все работает как нужно.
Код:
int main()
- Вопрос задан более трёх лет назад
- 242 просмотра
1 комментарий
Простой 1 комментарий
Модератор @TosterModerator
Данил дорогой пользователь, настоятельно рекомендуем еще раз обратить самое пристальное внимание на п. 3.1 регламента работы сервиса (и, в особенности, на его последний абзац).
В противном случае ваши вопросы будут удаляться по причине тег-спама, а систематические нарушения приведут к блокировке учетной записи.
Решения вопроса 0
Ответы на вопрос 2
«I’m here to consult you» © Dogbert
Первые два работают нормально, но когда доходит до 3, он не выполняется и длина выводится 0?
Потому что scanf(«%d», &n); зачитывает только один int из стандартного ввода. Если ты вводишь число и жмёшь enter, то конец строки остаётся в потоке ввода и читается gets’ом.
Поэтому нужно либо вводить строку предназначенную для gets следом за числом предназначенным для scanf, либо scanf сделать таким: scanf(«%d «, &n);
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Wundarshular @Wundarshular
Как отметил jcmvbkbc, у вас «застревает» код клавиши enter в потоке ввода — это распространённый нюанс работы с потоком на начальных этапах.
Как вариант, вы можете «вычищать» поток следующей конструкцией:
while (getchar() != ‘\n’);
будет происходить считывание ввода посимвольно, отправляя результат «в никуда», пока не будет считан символ ‘\n’ — после цикл завершится, и поток ввода уже не будет содержать данный символ.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- C
Компилятор выдаёт ошибку при попытке вызвать sizeof() относительно моего массива. Как исправить ошибку?
- 1 подписчик
- 4 часа назад
- 20 просмотров