Почему gets не работает после scanf

Проблема с scanf (), когда после нее стоит fgets () / gets () / scanf ()

Рассмотрим ниже простую программу на C. Программа читает целое число, используя scanf (), затем читает строку, используя fgets ().

// C программа для демонстрации проблемы, когда
// fgets () / gets () используется после scanf ()
#include

fgets (str, 100, stdin);

printf ( «x = %d, str = %s» , x, str);

Проблема с приведенным выше кодом заключается в том, что scanf () читает целое число и оставляет символ новой строки в буфере. Таким образом, fgets () читает только символ новой строки, а строка «test» игнорируется программой.

Подобная проблема возникает, когда scanf () используется в цикле.

// C программа для демонстрации проблемы, когда
// scanf () используется в цикле
#include

printf ( «. Enter q to quit. \n» );

printf ( «Enter a character\n» );

Мы можем заметить, что вышеупомянутая программа печатает дополнительный «Введите символ», за которым следует дополнительная новая строка. Это происходит потому, что каждый scanf () оставляет символ новой строки в буфере, который читается следующим scanf.

Как решить вышеуказанную проблему?

  1. Мы можем сделать scanf () для чтения новой строки, используя дополнительный «/ n», то есть scanf («% d / n», & x) . На самом деле scanf («% d», & x) также работает (обратите внимание на дополнительное место).
  2. Мы можем добавить getchar () после scanf (), чтобы прочитать дополнительную новую строку.

Смотрите это и это для исправленных программ.

Эта статья предоставлена Dheeraj Gupta . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Читайте также:  Как отремонтировать литой диск от царапин

Источник

Взаимодействие gets и scanf — Функция gets «пропускает» свой ввод

Здравствуйте!
Столкнулся с такой проблемой: после использования функции scanf, функция gets «пропускает» свой ввод. Как можно обойти такое «взаимодействие»? Gets необходим для забивания предложения, программа должна быть написана только на СИ.

Вот пример, иллюстрирующий данную проблему:

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Scanf пропускает следующий ввод
Есть такое: inputs(«Name: «, info->name, 30); if(!info->name) break; .

Создать классы «Computer», «Software», «User» и реализовать взаимодействие объектов этих типов между собой
Помогите решить задачку,нужна в инст на экзамен. Составить программу реализующую: .

«cin»,»cout» на «printf»,»scanf»
Вот ещё прога. Мне чисто нужно переделать её на printf,scanf и не используя функцию show, а puts и.

Как сделать так, чтобы scanf в переменную double мог считывать с клавиатуры не только «0,01», но и «0.01»
Помогите!) Не знаю, искал, не нашел, возможно ли вообще. Чтобы и так и так понимал.

Решение

Добавлено через 3 минуты 14 секунд
и не надо два раза файл открывать

Источник

Почему gets не работает после scanf

Функция gets() в этом случае (при использовании после scanf()) попросту не вызывается.
Чем это может быть вызвано и, самое интересное, как с этим бороться?
Просто заменить gets() на scanf() в моём случае нельзя, так как scanf() читает строки только до первого пробела

Попробуй использовать fflush:

Спасибо, проверим
Кстати, вчера ночью, когда это было срочно нужно, спасло вульгарное удвоение команды gets().

З.Ы.
Попробовал метод Trainer-а — будете смеяться, но с ним такая же ботва, как и с fgets. А вот fflush(stdin) помогает.

Функция (f)scanf вообще очень опасная, и ее можно использовать разве что в проектах для личного и недолгого использования.

Читайте также:  Как настроить себя перед важной встречей

Есть очень надежная и ИМХО оптимальная связка для работы с текстовым вводом: fgets+sscanf.
Этим способом можно гарантировать стабильность программы при любых входных данных (в отличие даже от С++ функций).

Источник

Fgets вместе с scanf не работает

Доброго времени суток. Я начинающий C программист. При создании своего файлового менеджера, я столкнулся с такой проблемой: после scanf не работает функция fgets.Предполагаю, что это связано с буфером, не представляю, как его отчистить. Как решить эту проблему?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Пользовательский ввод scanf() vs fgets()
Выполняю упражнение: поиск подстроки в строке. Почему программа не работает с функцией fgets() .

Конфликт fgets/gets_s с scanf, или снова про очистку буфера
Если функцию f1 запускать до scanf все работает корректно, если после то ввод строки не происходит.

Fgets() читает строку вместе с символом ‘\n’
Здравствуйте. Есть некая функция, которая получает на вход файл вот такого типа: слово1 слово2.

Компилятор как будто не видит scanf, а fgets выполняет перед printf, хотя расстановка абсолютно другая
В-общем, тема такая: читаю учебник, написано создать прогу для поиска текста в массиве строк.

Источник

fgets не работает после scanf

после того, как я ввел «петли», «s1» была назначена пустая строка автоматически. Как это происходит? Я уверен, что моя клавиатура работает нормально.

7 ответов

scanf() читает именно то, что вы просили, оставив следующее \n из конца этой строки в буфере, где fgets() будет читать. Либо сделайте что-то, чтобы потреблять новую строку, либо (мое предпочтительное решение) fgets() а то sscanf() от этой строки.

scanf оставляет пробелы во входном буфере, включая символы новой строки. Чтобы использовать fgets для чтения следующей строки, вам нужно вручную удалить остальную часть текущей строки:

Geekoaur ответил на ваш вопрос Хорошо, я просто указываю на еще одну «проблему» с вашим кодом.

Читайте также:  Почему не работает мегарешеба

строку s1[strlen(s1)] = ‘ ‘; это no-op если s1 allready правильно null завершается до его выполнения.

но если s1 не все готово должным образом null завершается до выполнения этой строки (и вам не повезло), это вызовет:

это так strlen basicaly находит индекс существующий нуль-Терминатор и возвращает его! Вот действительная, неоптимизированная реализация strlen:

так. Если вы действительно беспокоитесь о том, что строки не заканчиваются нулем, вы сделаете что-то вроде:

  • string[sizeof(string)]=’ ‘; on местные автоматические строки (где компилятор «знает» размер строки);
  • или string[SIZE_OF_STRING] для всех остальных строк, где SIZE_OF_STRING является (чаще всего) a #define ‘D константа или переменная, которую вы поддерживаете специально для хранения текущего размера (не длины) динамически выделенной строки.

и если вы действительно, действительно, действительно беспокоитесь о том, что строки не заканчиваются нулем (например, вы имеете дело с» грязными » методами libary (например, ATMI смокинга), вы и «очистить» свой «возврат строк» перед передачей их в подозрительные методы библиотеки с помощью:

  • перед: memset(string, NULL, SIZE_OF_STRING);
  • invoke: DirtyFunction(/*out*/string) ;
  • после: string[SIZE_OF_STRING]=’ ‘

SIG11-это полный biatch, чтобы найти, потому что (если вы не «зацепите» их с сигнал-процессор и сказать иначе, они заставляют unix жестко завершить вашу программу, поэтому вы не можете ничего регистрировать (после факта), чтобы помочь выяснить где-в-аду-у-что-иди-от. особенно учитывая, что во многих случаях строка кода, которая бросает SIG11, не-где-рядом с фактической причиной потери строки, является нулевым Терминатором.

это имеет смысл для вас?

Ура товарищу. Кит.

PS: ПРЕДУПРЕЖДЕНИЕ: strncpy не всегда nullterminate. ты наверное имел ввиду . Я понял это на собственном горьком опыте. когда 60 миллионов долларов биллинга запустить разбитый.

EDIT:

FYI: вот «безопасная» (неоптимизированная) версия strlen, которую я назову strnlen (Я думаю, это должно быть в stdlib. Вздох.).

Источник

Оцените статью