2015-09-10 1 views
-2

Я пытаюсь сделать это:Неопределенное поведение или определенное поведение?

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

#define MAX_SIZE 50 
int main() 
{ 
    char *s = malloc(sizeof(char)*MAX_SIZE); 
    do{ 
     int r = read(STDIN_FILENO, s, MAX_SIZE); 
     if(r==-1) printf("error "); 

     else{ 
     write(STDERR_FILENO, s, MAX_SIZE); 
     } 

     while(getchar()!='\n'); 
    } while(strcmp(s,"end\n")!=0); 

    free(s); 
    return 0; 
} 

Мой вопрос: является fflush (STDIN) в этом случае неопределенное поведение? Как я искал в Интернете, я читал, что в случае fflush (stdin) определено поведение: По стандарту C пропуск входного потока в fflush - неопределенное поведение ... STDIN - это входной поток (буферизованный) Я думаю, что неопределенное поведение - это когда стандарт C не указывает, какое поведение должно иметь определенную функцию в конкретных случаях.

Так что это неопределенное поведение, следуя стандарту C справа?

Так в этом случае не определено поведение?

+1

Не рекомендуется смешивать библиотеку stdio и использовать необработанные дескрипторы файлов. –

+2

Этот вопрос очень неясен. Вы показали какой-то код, который не использует 'fflush' и полон нерелевантных отвлекающих факторов,' malloc' и 'free' бесполезны (просто используйте' char s [50] '),' MAX_SIZE' бесполезен, sizeof (char) 'бесполезен и т. д. Также« вопрос »- это то же самое, что повторяется 3 или 4 раза с немного иной фразировкой и плохой пунктуацией, тогда вы задаете один и тот же вопрос дважды. Не может ли все это просто быть «fflush (stdin)« неопределенное поведение »? и избавиться от всего остального ?! –

+0

Почему плохая идея? @Ed Heal –

ответ

2

Описание fflush в стандарте C представляется очевидным:

Если поток указывает на выходной поток или поток обновлений, в котором самая последняя операция не была ввода, [...]; в противном случае, Поведение является undefined.

Передача входного потока до fflush - это неопределенное поведение.

+1

[SingleUnix] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html) добавляет поведение для входных потоков поиска. Я не уверен, что это действительно полезно и реализовано в любом месте. – dhke

+0

Большое спасибо! Теперь я понял. Благодарю. –

+1

@dhke, это хороший момент, POSIX (который реализован очень широко!) Делает его определяемым как расширение базового стандарта C. Но это только влияет на потоки, способные искать, чего обычно нет. –