2015-09-10 33 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(标准输入),在这种情况下,一个未定义的行为吗? 正如我在互联网上搜索,我认为,在一种情况下,fflush(stdin)是一个定义的行为: 由标准C通过一个输入流fflush是一个未定义的行为... STDIN是一个输入流(缓冲) 我认为未定义的行为是在标准C没有指定在特定情况下哪些行为必须具有特定功能的情况。

因此,它是按照标准C权的未定义行为?

那么在这种情况下一个未定义的行为?

+1

不是一个好主意混合stdio库,并使用原始文件的描述符。 –

+2

这个问题很不清楚。你已经展示了一些代码,不使用'fflush'和充满无关的杂念,在'malloc'和'free'是无用的(只是用'个char [50]')'MAX_SIZE'是没用的,'的sizeof(char)'是无用的等等。此外,“问题”是同样的事情,重复3或4次,略有不同的措辞和糟糕的标点符号,然后你再问两次相同的问题。难道整个事情都不是简单的“是”fflush(stdin)'未定义的行为?“并摆脱所有的休息?! –

+0

为什么一个坏主意? @Ed Heal –

回答

2

fflush C标准中的描述似乎很清楚:

如果流点到输出流或其中的最近操作不是输入的更新流,[...];否则,的行为是不确定的

传递输入流到fflush是未定义的行为。

+1

[SingleUnix](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html)为可搜索输入流添加行为。不过,我不太确定这是否真的有用并在任何地方实施。 – dhke

+0

非常感谢!现在我明白了。谢谢。 –

+1

@dhke,这是一个很好的观点,POSIX(它的实现非常广泛!)使它被定义为基本C标准的扩展。但它只对能够寻找的流有影响,而stdin通常不会。 –