2015-12-04 3 views
2

У меня есть программа, которая имеет следующие цели:Scanf входа и другие вопросы

  1. читать ввод в массив

  2. Чтения до EOF

  3. Записи количество успешных (цифровых) входов

Я начинаю с инициализации:

int array[200]; 
int size = sizeof(array)/sizeof(int); 
int num_inputs = 0; 

Затем вызвать функцию void input(int * array, int size, int *num_inputs)

input(array, size, &num_inputs); 

_

void input(int * array, int size, int *num_inputs) { 

    int i = 0; 

    printf("Enter numbers:\n"); 
    while(scanf("%d", &array[i]) != EOF) { 
     i++; 
     *num_inputs++; 
     if (i == (size-1)) 
      break; 
    } 
} 
  1. num_inputs не работает. От отладки (или того, что я знаю об отладке) num_input идет от 0 до некоторого случайного числа. Что я делаю не так? Что-то с указателями?

  2. Предположим, что я ввожу 5 9 8 8 3 4 - будет ли сканировать f как 6 входов? Будет ли num_input быть 6? Если нет, как мне это достичь? Я хочу, чтобы иметь возможность написать 5 6 3 6 Newline 4 9 3 и программа, чтобы иметь возможность интерпретировать его как писать 7 вещей в массив и num_input быть 7.

Спасибо заранее.

+3

1) '* num_inputs ++;' -> '++ * num_inputs, или' (* num_inputs) ++; ' – BLUEPIXY

+1

Примечание: 'array [199]' не используется. Я бы ожидал 'while (i chux

+0

'scanf()' может возвращать EOF, но это не является важным критерием для проверки. Скорее проверьте, сколько из «спецификаторов формата» в строке формата были успешно введены/преобразованы. Для вызова 'scanf()' в опубликованном коде возвращаемое значение для проверки равно 1, а не EOF. – user3629249

ответ

1
  1. @BlueMoon Как уже упоминалось, это происходит потому, что вы увеличивающиеся указатель num_inputs. Не указатель *num_inputs.

    Итак, измените *num_inputs++; на (*num_inputs)++; (Или используйте локальную переменную, спасибо @BlueMoon).

  2. Да. После вышеуказанного изменения вы получите требуемый результат для обоих случаев.

Run и проверить код ниже:

#include <stdio.h> 

void input(int * array, int size, int *num_inputs) { 

    int i = 0; 

    printf("Enter numbers:\n"); 
    while(scanf("%d", &array[i]) != EOF) { 
     i++; 
     (*num_inputs)++; 
     if (i == (size-1)) 
      break; 
    } 
} 


int main() { 
    int array[200]; 
    int size = sizeof(array)/sizeof(int); 
    int num_inputs = 0; 
    input(array, size, &num_inputs); 
    printf("num_inputs: %d\n",num_inputs); 
    return 0; 
} 
+0

Незначительный: лучше использовать 'while (scanf ("% d ", & array [i]) == 1) {' else код будет неправильно подсчитываться, если 'scanf («% d », & array [i])! = EOF 'встречает нечисловые данные. – chux

1

Проблема с этой линии:

*num_inputs++; 

Это deferences и возвращает значение, а затем увеличивает указатель, но pointee не увеличивается вообще. Он эффективно вызывает undefined behaviour из-за увеличения указателя.

Именно поэтому всегда лучше писать код, так что вам не нужно беспокоиться о приоритете. Используйте локальную переменную и используйте ее для увеличения в цикле и, наконец, назначьте ее *num_inputs.

int count = 0; 

while(scanf("%d", &array[i]) != EOF) { 
     i++; 
     count++; 
     if (i == (size-1)) 
      break; 
} 

*num_inputs = count; 
Смежные вопросы