Автор Гілка: fflush  (Прочитано 4235 раз)

Відсутній MoD

  • Кореспондент
  • ***
  • дописів: 161
  • Карма: +0/-0
fflush
« : 2005-05-20 01:50:56 »
Виникли деякі проблеми з використанням сабжевої функції з бібліотеки стандартного вводу/виводу в gcc. З stdout вона працює, а от з stdin - ні, хоча помилок при цьому не видає. Потрібно зкинути stdin для чергового вводу з консолі (gets, scanf), а оскільки з попереднього в буфері залишається '\n', то при наступному воно його і ковтає разом з тим, що не було зчитано до нього попереднім викликом. Це діло можна обійти повторним зчитуванням аж допоки не пройде цей самий EOL, а чи можна якось по-цивільному це зробити?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3749
  • Карма: +9/-0
  • Програміст
Re: fflush
« Відповідей #1 : 2005-05-20 12:28:59 »
man fpurge

PS.
man fgets
[Fedora Linux]

Відсутній MoD

  • Кореспондент
  • ***
  • дописів: 161
  • Карма: +0/-0
Re: fflush
« Відповідей #2 : 2005-05-21 01:20:13 »
Дякую, але цей fpurge не дуже портабельний (так в манах пишуть), а мені кросплатформеність з віндами потрібна, хоча під ними здається можна і простий flush зробити.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3749
  • Карма: +9/-0
  • Програміст
Re: fflush
« Відповідей #3 : 2005-05-27 18:37:30 »
Дякую, але цей fpurge не дуже портабельний (так в манах пишуть), а мені кросплатформеність з віндами потрібна, хоча під ними здається можна і простий flush зробити.
Ну тоді користуйтеся fgets - і надійніше і \n кінцевий не залишає у буфері.
[Fedora Linux]

Відсутній MoD

  • Кореспондент
  • ***
  • дописів: 161
  • Карма: +0/-0
Re: fflush
« Відповідей #4 : 2005-05-27 22:18:50 »
А коли форматований ввід потрібен (scanf) тоді, що? Або простий getchar?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3749
  • Карма: +9/-0
  • Програміст
Re: fflush
« Відповідей #5 : 2005-05-31 17:22:11 »
А коли форматований ввід потрібен (scanf) тоді, що?
Тоді sscanf.
[Fedora Linux]

Відсутній MoD

  • Кореспондент
  • ***
  • дописів: 161
  • Карма: +0/-0
Re: fflush
« Відповідей #6 : 2005-05-31 20:47:21 »
Нафіг мені sscanf - він же читає з поданої йому строки, а потрібен форматований ввід з stdin. Просто scanf залишає в буфері "кінець строки" як і getchar.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3749
  • Карма: +9/-0
  • Програміст
Re: fflush
« Відповідей #7 : 2005-06-01 16:12:24 »
Нафіг мені sscanf - він же читає з поданої йому строки, а потрібен форматований ввід з stdin. Просто scanf залишає в буфері "кінець строки" як і getchar.

#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 100

/*
 * Expect a line containing
 *   <int> <double> <6 char string>
 */
int main ( void )
{
  char buff[BUFSIZE];
  char s[7] = {0}; /* +1 for nul */
  double f;
  int n;

  if ( fgets ( buff, sizeof(buff), stdin ) != NULL ) {
    if ( sscanf ( buff, "%d %lf %6c", &n, &f, s ) != 3 ) {
        fprintf ( stderr, "Invalid input\n" );
        exit ( EXIT_FAILURE );
    }

    printf ( "%d:\n\t%s -- %f\n", n, s, f );
  }

  return 0;
}

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1048382193&id=1043284392


gets - небезпечна функція:

FunctionSeveritySolution
getsMost riskyUse fgets(buf, size, stdin). This is almost always a big problem!

http://www-106.ibm.com/developerworks/library/s-buffer-defend.html
http://www.auscert.org.au/render.html?it=1975
http://www.cgsecurity.org/Articles/SecProg/Art3/

« Змінено: 2005-06-01 16:15:06 від lvm »
[Fedora Linux]

Відсутній MoD

  • Кореспондент
  • ***
  • дописів: 161
  • Карма: +0/-0
Re: fflush
« Відповідей #8 : 2005-06-01 17:13:17 »
Дякую!! Я якось не додумався до такого використання цих функцій. Тепер зрозуміло. Щодо небезпечності gets я в курсі. І за посилання також дякую.