fflush(stdin)的工作如何改变下面代码中的输出?

时间:2016-07-12 10:11:44

标签: c fflush

#include <stdio.h>
int main()
{
        int test_no ,count=1,i,n,j;
        scanf("%d",&test_no);
        fflush(stdin);
        int arr1[test_no];
        for(i=0;i<test_no;i++)
        {
                scanf("%d",&n);
                printf("\n");
                int arr[n];
                for(j=0;j<n;j++)
                {
                        fflush(stdin);
                        scanf("%d",&arr[i]);
                }
                for(j=1;j<=n-1;j++)
                {
                        if(arr[j-1]>arr[j])
                        {
                                count++;
                        }
                }
                if(n==1)
                {
                        arr1[i]=1;
                }
                else
                {
                        arr1[i]=count;
                }
                count=1;
        }
        for(i=0;i<test_no;i++)
        {
                printf("%d\n",arr1[i]) ;
        }
        return 0;
}

此解决方案适用于此problem

我没有得到第三种情况所需的输出,它给我的输出为3或4,具体取决于我是fflush(stdin)之前还是scanf("%d",arr[i])之后,请告诉我这段代码存在问题。

1 个答案:

答案 0 :(得分:5)

no 一些神奇的方式。

首先,fflush(stdin);调用undefined behavior 不要使用它。

引用C11,章节§7.21.5.2, fflush函数强调我的

  

如果stream指向输出流或最新的输出流   如果没有输入操作,fflush函数会导致该流的任何未写入数据   要传递到主机环境以写入文件; 否则,行为是   未定义。

那就是说,

for(j=0;j<n;j++)
{
    fflush(stdin);
    scanf("%d",&arr[i]);
}

对我来说看起来很不对,arr[i]不能保证在范围内。它应该是

scanf("%d",&arr[j]);