2013-06-26 3 views
2

Я использовал fflush() в Linux GCC, но это не сработало. Существуют ли альтернативы для этой функции? Вот мой код:fflush() не работает в Linux

#include<stdio.h> 
void main() 
{ 
    char ch='y'; 
    while(ch=='y') 
    { 
    int a; 
    printf("Enter some value:"); 
    scanf("%d",&a); 
    fflush(stdin); 
    printf("Do you want to continue?"); 
    scanf("%c",&ch) 
    } 

Вывод, который я получил это:

Enter some value: 10 

Затем программа завершается. Это все. Что я могу сделать в Linux? Есть ли альтернативная функция?

+3

Помните, что очистка 'stdin' на самом деле не определена. Не делай этого. –

+4

Не 'fflush (stdin)'. Вместо этого измените 'scanf()' на 'fgets()'. –

+0

Что вы пытаетесь сделать? – Stefan

ответ

7

Не используйте fflush, используйте эту функцию вместо:

#include <stdio.h> 
void clean_stdin(void) 
{ 
    int c; 
    do { 
     c = getchar(); 
    } while (c != '\n' && c != EOF); 
} 

fflush(stdin) зависит от реализации, но эта функция работает всегда. В C считается плохой практикой использовать fflush(stdin).

+2

'fflush (stdin)' - плохая практика, а не 'fflush'. ;) – md5

+0

Вы правы, я редактирую этот – Mathuin

+0

@ md5, что вы имеете в виду «не fflush». вы имеете в виду, что fflush - хорошая практика? или fflush без параметров не существует? – barlop

1

fflush() не делает много для входных потоков, но поскольку scanf() никогда не возвращает, это не имеет значения. scanf() блоков, потому что окно терминала не посылает ничего к программе C, пока вы не нажмете Enter

У вас есть два варианта:

  1. Тип 10Введите
  2. Поместите терминал в нестандартный режим ,

Второй вариант имеет много drawbacls, как вы потеряете возможности редактирования, поэтому я предлагаю прочитать ввод строки за строкой.

3

Поведение fflush не определена для входных потоков (online 2011 standard):

7.21.5.2 The fflush функция

Сводка

Описание

2 Если поток указывает на выходной поток или поток обновлений, в котором не была введена самая последняя операция , функция fflush приводит к тому, что любые неписанные данные для этого потока должны быть доставлены в среду хоста для записи в файл; в противном случае поведение не определено.

3 Если stream является нулевым указателем, функция fflush выполняет это промывочное действие для всех потоков , для которых поведение определено выше.

Возвращает

fflush функция устанавливает индикатор ошибки для потока и возвращает EOF, если происходит ошибка записи , в противном случае она возвращает ноль.
1

Вместо этого вы должны включить и использовать __fpurge (что бы вы ни хотели).

Salute от аргентина

+1

Вы должны объяснить, почему вам нужно включить это, а не просто сказать, что вы это делаете. – phyrrus9

2

Тот, который всегда работает на Linux:

#include <termios.h> 
#include <unistd.h> 

void clean_stdin() 
{ 
     int stdin_copy = dup(STDIN_FILENO); 
     /* remove garbage from stdin */ 
     tcdrain(stdin_copy); 
     tcflush(stdin_copy, TCIFLUSH); 
     close(stdin_copy); 
} 

Вы можете использовать tcdrain и tcflush не только в/из/ERR дескриптором.

2

Я столкнулся с такой же проблемой при работе с LINUX, и альтернативное решение этой проблемы может заключаться в том, что вы определяете фиктивный символ, который позволяет говорить, что char dummy; и сканировать его непосредственно перед вашим фактическим вводом. Это сработало для меня. Надеюсь, это сработает и для вас.

0

Используя системный вызов bzero(); в Linux, мы можем сбросить предыдущее сохраненное значение.
Пожалуйста, прочитайте страницу руководства bzero();, набрав в терминале man bzero. попробуйте этот пример

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    char buf[]={'y'}; 
    int num; 
    while(buf[0]=='y') 
    { 
    printf("enter number"); 
    scanf("%d",&num); 
    printf("square of %d is %d\n",num,num*num); 
    bzero(buf, 1); 
    printf("want to enter y/n"); 
    scanf("%s",&buf[0]); 
    } 
    return 0; 
} 
+0

Этот код вызовет переполнение буфера на строке 'scanf («% s »). Кроме того,' buf [0] = 0; 'будет менее подвержен ошибкам, чем' bzero (buf, 1) '. –