Почему не работает 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)А.Васильев
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
Функция gets() в этом случае (при использовании после scanf()) попросту не вызывается.
Чем это может быть вызвано и, самое интересное, как с этим бороться?
Просто заменить gets() на scanf() в моём случае нельзя, так как scanf() читает строки только до первого пробела
Сообщ. #2 , 16.02.04, 05:02
Рейтинг (т): 640
Zabiyaka, 16.02.04, 02:44
Просто заменить gets() на scanf() в моём случае нельзя, так как scanf() читает строки только до первого пробела
Можно, причем очень просто:
char buffer[256];
printf(«Введите строку: «);
scanf(«%255[^\n\r]»,buffer);
Сообщ. #3 , 16.02.04, 07:55

Рейтинг (т): 683
Попробуй использовать fflush:
fflush(stdin);
Сообщ. #4 , 16.02.04, 18:48
Unregistered
Спасибо, проверим
Кстати, вчера ночью, когда это было срочно нужно, спасло вульгарное удвоение команды gets().
З.Ы.
Попробовал метод Trainer-а — будете смеяться, но с ним такая же ботва, как и с fgets. А вот fflush(stdin) помогает.
Сообщение отредактировано: Zabiyaka — 16.02.04, 19:24
Сообщ. #5 , 17.02.04, 14:01
Senior Member
Рейтинг (т): 31
Функция (f)scanf вообще очень опасная, и ее можно использовать разве что в проектах для личного и недолгого использования.
Есть очень надежная и ИМХО оптимальная связка для работы с текстовым вводом: fgets+sscanf.
Этим способом можно гарантировать стабильность программы при любых входных данных (в отличие даже от С++ функций).
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Общие вопросы
- Следующая тема
- Форум на Исходниках.RU
- Программирование
- C/C++
- C/C++: Общие вопросы
char *gets(char *str)
Функция gets() считывает символы из stdin и помещает их в массив символов, на который указывает str. Символы считываются до тех, пока не встретится новая строка или EOF. Символ «новая строка» не делается частью строки, а транслируется в нулевой символ, завершающий строку.
В случае успеха gets() возвращает str, в противном случае она возвращает NULL. В случае ошибки по чтению содержимое массива, на который указывает str, не определено.
Поскольку NULL возвращается как в случае ошибки, так и при достижении конца файла, то следует использовать feof() или ferror(), чтобы выяснить, что именно произошло.
Количество символов, считываемых gets(), не ограничивается. Поэтому программист должен сам следить за тем, чтобы не выйти за границы массива, на который указывает str.
В данной программе gets ( ) используется для чтения имени файла :
#include
#include
int main ( void )
{
FILE * fp ;
char fname [ 128 ] ;
printf ( «Enter filename: » ) ;
gets ( fname ) ;
if ( ( fp = fopen ( fname , «r» ) ) == NULL ) {
printf ( «Cannot open file. \n » ) ;
exit ( 1 ) ;
}
.
fclose ( fp ) ;
return 0 ;
}
