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

RAD*_*GIA -1 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;
}
Run Code Online (Sandbox Code Playgroud)

该解决方案是这一问题.

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

Sou*_*osh 5

没有 一些神奇的方式.

首先,fflush(stdin);调用未定义的行为.不要使用它.

引用C11,章§7.21.5.2,fflush函数(重点煤矿)

如果stream指向输入流或未输入最近操作的更新流,则该fflush函数会将该流的任何未写入数据传送到主机环境以写入该文件; 否则,行为未定义.

那说,

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

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

scanf("%d",&arr[j]);
Run Code Online (Sandbox Code Playgroud)