Почему не работает gets c
Перейти к содержимому

Почему не работает gets c

  • автор:

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

Модератор @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’ — после цикл завершится, и поток ввода уже не будет содержать данный символ.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

программирование

  • Программирование
  • +4 ещё

C++ как сделать совместимую между компиляторами динамическую линковку функций?

  • 1 подписчик
  • 18 часов назад
  • 71 просмотр

Почему не работает 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

char *gets(char *str)

Функция gets() считывает символы из stdin и помещает их в массив символов, на который ука­зывает str. Символы считываются до тех, пока не встретится новая строка или EOF. Символ «но­вая строка» не делается частью строки, а транслируется в нулевой символ, завершающий строку.

В случае успеха gets() возвращает str, в противном случае она возвращает NULL. В случае ошиб­ки по чтению содержимое массива, на который указывает str, не определено.

Поскольку NULL возвращается как в случае ошибки, так и при достижении конца файла, то следует использовать feof() или ferror(), чтобы выяснить, что именно произошло.

Количество символов, считываемых gets(), не ограничивается. Поэтому программист должен сам следить за тем, чтобы не выйти за границы массива, на который указывает str.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *