Как работает fflush (stdin), изменяя вывод в приведенном ниже коде?

#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;
}

Это решение к этомупроблема.

Я не получаю желаемый вывод для третьего случая, он дает мне вывод 3 или 4 в зависимости от того, помещу ли яfflush(stdin) доscanf("%d",arr[i]) или послеscanf("%d",arr[i]) Пожалуйста, расскажите о проблеме с этим кодом.

 pzaenger12 июл. 2016 г., 12:13
Это выглядит довольно забавно, но, пожалуйста: отформатируйте ваш код правильно.
 Sourav Ghosh12 июл. 2016 г., 13:15
Для справки: отмеченный дупе:stackoverflow.com/questions/22901901/...
 Sourav Ghosh12 июл. 2016 г., 13:15
Я вновь открываю вопрос, так как отмеченный обман очень актуален, ноне правильный обман. Кроме вопроса, обсуждаемого в отмеченном дупе, естьявляются другие вопросы, которые необходимо решить.

Ответы на вопрос(1)

Решение Вопроса

нет какой-то волшебный путь.

Прежде всего,fflush(stdin); Запускаетнеопределенное поведение. Не используйте это.

квотирование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]);
 too honest for this site12 июл. 2016 г., 12:29
@RADHAGOGIA: Google недоступен с вашего сайта? Ожидается, что вы приложите хотя бы немного усилий самостоятельно. Если не дляfflush(stdin)По крайней мере, для "неопределенного поведения"!
 Sourav Ghosh12 июл. 2016 г., 15:26
@RADHAGOGIA Какую часть вы не поняли? Все это говорит, использоватьfflush с потоком, который связан с выводом, какstdout, Не используйте его на входных потоках, напримерstdin.
 RADHA GOGIA12 июл. 2016 г., 12:26
Да, я просто упустил этот момент, спасибо, но это неопределенное поведение, которое вы упомянули в отношении fflush (stdin), что я не могу связать это должным образом, не могли бы вы объяснить это еще раз

Ваш ответ на вопрос