EgoRusMarch
@EgoRusMarch
C++ Developer

Как пропустить весь поток для того, чтобы можно было воспользоваться getchar()?

Вот код:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20+1

int main(void)
{
	unsigned char alphabet[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
	unsigned char word[SIZE];
	unsigned char c;
	const int m = 33;
	int a ;
	int b;
	int i;

	do {
		printf("Введите a (a>0):\t");
		scanf("%d",&a);
	} while(a<=0);

	do {
		printf("Введите b (b>33):\t");
		scanf("%d",&b);
	} while(b<=33);

	printf("Введите слово:\n");

	for(i=0; (c=getchar())!='\n' && i<SIZE-1; ++i)
		word[i] = c;
	word[i] = '\0';

	printf("\n%s\n",word);

	system("pause");
	return 0;
}

Без printf() и scanf() все работает. Мне как-то нужно пропустить весь поток, чтобы перед
for(i=0; (c=getchar())!='\n' && i<SIZE-1; ++i)
	word[i] = c;
word[i] = '\0';
он был пуст.
  • Вопрос задан
  • 419 просмотров
Решения вопроса 3
@abcd0x00
Запомни одно
fflush(stdin);
это полное фуфло от незнающих. В стандарте оно не определено, поэтому на разных компиляторах оно будет по-разному себя вести в итоге. В лучшем случае оно ничего не будет делать, в худшем - выдаст какой-нибудь мусор.

Твоя проблема в том, что после ввода числа там сохраняется перевод строки (нажатый Enter) и вот его-то и надо прочитать.

scanf("%d%*c", &a);

А вообще, не надо использовать scanf() таким образом. Вместо этого надо сделать getline() на базе fgets() + sscanf() - и тогда всё будет работать точно.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
fflush(stdin);

Но такое поведение «новодел» и не заспецифицировано жёстко. В Windows работает, в Linux, говорят, тоже, а в BSD и его производных (Mac) — уже нет.

Кто-то подсказывает такую штуку
if ( ferror( stdin ) || feof( stdin ) )
    clearerr( stdin );
    else rewind( stdin );
Ответ написан
EgoRusMarch
@EgoRusMarch Автор вопроса
C++ Developer
  1. fflush(stdin)не определено стандартом
  2. rewind(stdin) — устанавливает внутренний указатель положения файла в начало, но с stdin каким-то чудом работает (лучше не использовать)
  3. scanf("%*c")решение
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы