очистить входной поток stdin от лишних символов

Forums:

Новое решение здесь

Очистить входной поток stdin от лишних си Можно , просто чистя его каждый раз, когда мы хотите считать символ вызывая после

getchar()

конструкцию

while (getchar() != '\n');

- соответственно, если пользователь введёт более оного символа - то всё лишнее вместе с символом перевода строки будет убрано из потока ввода
- такой способ соответствует стандартам и вполне переносим с одной платформы на другую.

_____________________________________________
Источники(читать подробнее)=
Ключевые слова и фразы(для поиска)=
как очистить stdin
vedro-compota's picture

А что если мы не знаем о состоянии входного потока и нам требуется его очистить в случае, если он заполнен . пример - есть функция меню =

int main()
	 {  char ch;   /*printf("\n%s","print some line \n");*/
           printf("\n%s","print some line \n"); 
       ch = getchar();
		 mainmenu();


	return 0;
	   
	 }

  int mainmenu(void)
  {

     int ch; /* вспомогательная переменная символьного типа*/
	 char* mtext = " Please specify the number of the task. \n * You can choose on number from set = {1} \n * Specify \"0\" to exit\n" ;
	 char* errmes = " Error(!) = Main menu does not support this command.\n Make sure that your task number is from menu set of commands and try again. " ;
	 

	while (getchar() != '\n');         /* fflush(stdin); clean the input - stdin or use while (getchar() != '\n'); - but this'll stop program*/
       printf("\n%s",mtext );
      ch = getchar() ;
	
	 switch(ch)
     {
		case '0':    printf("\n%s","00000" );   /*выходим с уведомлением об успешном завершении - с параметром 0 */
		                break;
		case '1':    printf("\n%s","111111" );
			         break;
		default: printf("\n%s\n", errmes);
	 }	
   return 0; 
  }

чтобы получить корректные данные от пользователя входной поток должен быть очищен,
но возникает проблема - что если входной поток изначально был пуст -
то есть вызывающая функция имела вид =

int main()
	 {  
	mainmenu();
	return 0;
	   
	 }

если это так то наша функция mainmenu() остановит выполнение программы ожидая нажатия enter - так вот возникает вопрос - как сделать работу mainmenu() независимой от контекста вызывающей функции.
Примечание: можно было бы просто использовать

fflush(stdin);

но эта функция вроде как обладает нестандартным поведением - то есть её реализация разнится в разных средах и компиляторах......

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

int inputcl(void)
{
   printf("\n[%s]\n", "If nothing take place - press enter to continue the program execution.");
   while (getchar() != '\n'); /*remove \n  or other useless data*/
   
   return 0;
}

_____________
матфак вгу и остальная классика =)