2014-08-27 1 views
2

Я делаю небольшую программу как упражнение, которая позволяет хранить до шести целых четных чисел, или если пользователь хочет закончить его только ввод 99, при в конце программы отображаются 6 сохраненных номеров.позволяют хранить до 6 четных чисел (нажмите 99 для завершения)

Проблема в том, когда нажата 99, она гаснет и отображает массив из 6 чисел, как и планировалось, однако последний номер массива (массив [5]) всегда равен 99, и я не могу найти причину это происходит.

Ниже приведен код программы:

#include <stdio.h> 

int main(void) 
{ 
    int i; /*integer value*/ 
    int count; /*even values counter defined as 6*/ 
    int array[5] ; /*array where we will save the values*/ 
    int pos = 0; /*array position*/ 

    for (pos = 0; pos < 6; ++pos) 
     array[pos] = 0; 

    pos = 0; 

    for (count = 6 ; count > 0 ; --count) 
    { 
     do 
     { 
      puts("please write an even integer value or 99 to exit:"); 
      fflush(stdin); 
      scanf("%d", &i); 

      if ((i%2) == 0) 
       array[pos++] = i; 
            ; 
     } while((i % 2) != 0 && i != 99); 

     if (i == 99) 
      count = 0; 

    } 


    printf("\n\nThe even integer values you wrote are:\n\n"); 

    for (pos = 0; pos <= 5; ++pos) 
     printf(" %d ", array[pos]); 

    return 0; 
} 
+8

'int array [5]' не будет содержать 6 чисел, а доступ к 'array [5]' вызывает * неопределенное поведение *. Массив '[5]' индексируется из '0..4' и содержит ** пять **' int'; не шесть. Примечательно, что 'fflush (stdin)' нестандартен; найти другой способ очистки ваших входных данных. – WhozCraig

+0

fflush (stdin) Я удалю его. Но в отношении массива я не согласен, поскольку, когда я ввожу в общей сложности 6 четных чисел, он определенно показывает 6-й, который является массивом [5]. Но так или иначе Как вы думаете, это может привести к тому, что 99 всегда будет на последней позиции? –

+1

Ваше замешательство * наблюдается * поведение с * определенным * поведением. Как написано, ваша программа плохо сформирована и вызывает неопределенное поведение. Следовательно, результаты являются * без определения *. Не согласен, если хочешь, но нарушаешь правила. Без правил * ничего * может случиться, даже изредка, то, что вы надеялись. – WhozCraig

ответ

4

Как @WhozCraig прокомментировал int array[5] не будет содержать количество элементов, и должно быть изменено на int array[6].

+0

Пост-инкремент здесь бесполезен. – Quentin

+0

@Quentin Вы правы, я забыл, что он был выполнен, я думал, что он пропустит 0-й элемент. Я отредактирую, чтобы удалить это. – Yann

+1

+1. Что касается post-increment в цикле, если вы не нуждаетесь в * предыдущем выражении, используйте pre-increment. Современным компиляторам все равно, и полученный код asm, вероятно, будет таким же, но есть * шанс *, это будет иметь значение, и он * определенно * может иметь значение при использовании сложного post-vs-pre-increment оператор переопределяет такие языки, как C++. Обычно никакой разницы в оптимизированном C, но стоит того, чтобы быть привычкой независимо. Используйте pre-increment, если вы специально не нуждаетесь * в том, что результат выражения с предварительным значением. – WhozCraig

Смежные вопросы