2014-10-19 37 views
1

对于这个愚蠢的问题,我很抱歉。我有C程序提示用户输入年龄和姓名,然后将年龄和姓名打印到屏幕上。这是我从书中读取的练习。fflush()函数不能使用stdin

此程序:

#include <stdio.h> 

int main (void) { 
    int age; 
    char name[20]; 

    puts("Enter your age:"); 
    scanf("%d",&age); 

    fflush(stdin); 

    puts("Enter your name:"); 
    scanf("%s",name); 

    printf("Your age is %d\n",age); 
    printf("Your name is %s\n",name); 

    return 0; 
} 

当我输入额外的字符到第一scanf()程序终止,并分配多余的字符到下一个scanf()

然后,我改变了代码,并添加功能命名为clear_buff()并使用clear_buff()中的fgets函数读取码流中剩余的字符。该代码按我的预期工作。

#include <stdio.h> 

#define MAXLEN 80 

void clear_buff(void); 

int main (void) { 
    int age; 
    char name[20]; 

    puts("Enter your age:"); 
    scanf("%d",&age); 

    clear_buff(); 

    puts("Enter your name:"); 
    scanf("%s",name); 

    printf("Your age is %d\n",age); 
    printf("Your name is %s\n",name); 

    return 0; 
} 

void clear_buff(void){ 
    char junk[20]; 
    fgets(junk,MAXLEN,stdin); 
} 

我的问题是为什么fflush(stdin)不能在此程序中工作?

该书说fflush函数清除流中的任何缓冲数据。而且我知道 fflush()函数是C标准函数,如果使用I/O流。

+0

尝试'fflush(stdout)'。 – 2014-10-19 01:27:12

+0

'fflush'用于清除输出。 [见这里](http://stackoverflow.com/questions/7898215/how-to-clear-input-buffer-in-c)了解如何清除输入。 – 2014-10-19 01:29:14

+0

输入流(如stdin)上的'fflush'具有未定义的行为。 – 2014-10-19 01:33:55

回答

7

fflush是指具有输出或更新流的工作,并用它与输入流是未定义的行为,从cppreference C型钢为fflush

的行为是不确定如果给定的流是输入的类型或给定流是否为更新类型,但最后的I/O操作不是输出操作。

undefined behavior是行为标准没有规定,这意味着你的程序的结果是不可预知的,这可能意味着行为似乎正常或者崩溃或其他不良影响。

cppreference是选秀C99标准节7.19.5.2fflush函数它说的语言是一致的:

如果流点到输出流或其中 最近一次操作是一个更新流未输入,fflush函数会将该流的任何未写入数据传递到主机环境 以写入文件;否则,行为是不确定的。

虽然这不是真的你的问题,好像你已经找到了一个变通,问题C, flushing stdin占地面积冲洗stdin的一些适当的方法。

+0

你能向我解释什么是'如果给定的流是输入类型,或者如果给定的流是更新类型,但最后的I/O操作不是输出操作,我很抱歉,我刚刚开始学习C,我试图理解那个陈述,但仍然不明白。 – harianja 2014-10-19 01:53:13

+0

@harianja我添加了一些关于未定义行为的更多细节。如果你指的是输入,输出和更新流之间的差异,那么这将打开一个阅读,写作或阅读和写作流。有关不同的模式,请参见[fopen](http://en.cppreference.com/w/cpp/io/c/fopen)。 – 2014-10-19 02:22:47

相关问题