Как получить функцию ввода для массива для завершения на основе конкретного ввода и размера?

У меня есть функция ввода для массива, который инициализируется, чтобы содержать 50 элементов. Цикл, который собирает входные данные от пользователя, завершается после ввода значения "-1" и ввода 50 записей.

Для того, чтобы правильно протестировать программу, у меня есть 2 теста:

  1. Введено менее 50 значений, и набор данных оканчивается на "-1".
  2. Введено 50 значений, и набор данных не заканчивается на "-1".

Я могу заставить первый тестовый пример работать, но для второго тестового примера он, похоже, заходит в бесконечный цикл. Как бы я изменил свою функцию ввода, чтобы она работала и для второго контрольного примера?

Основная функция:

#include<stdio.h>
#include<stdlib.h>
//Global Declarations
#define SIZE 50

int getFuelRange();
int getStartMile();
void getMileMarkers(int markers[], int*);
void bubbleSort(int markers[], int);
int searchArray(int markers[], int, int);
int calcDifference(int markers[], int, int, int);
int findSize(int markers[]);
//void displayResults();

int main()
{
  //Local Declarations
  int fuelRange;
  int startMile;
  int markers[SIZE];
  int i = 0;
  int points;
  int size;

  //Executable Statements
  fuelRange = getFuelRange();
  startMile = getStartMile();
  getMileMarkers(&markers[i], &size);
  //Diagnostics
  //printf("\nFuel Range: %d Start Mile: %d\n", fuelRange, startMile);
  //printf("\nSize: %d \n", size);
  points = calcDifference(&markers[i], fuelRange, startMile, size);


  //Diagnostics
  //printf("\nFuel Range: %d Start Mile: %d\n", fuelRange, startMile);
  printf("Points: %d \n", points);

  return(0);
}

Функция ввода:

void getMileMarkers(int markers[], int *size)
{
  //LOCAL DECLARATIONS
  int i = -1; //counter
  //EXECUTABLE STATEMENTS
  printf("Enter mile marker positions: ");
  do
  {
    i++;
    scanf("%d", &markers[i]);
    //Diagnostic Print
    printf("\n%d", markers[i]);
  }while(markers[i] != -1 && i < SIZE);
  (*size) = i;
}

Любая помощь приветствуется! Спасибо!

1 ответ

Решение

Гораздо проще и удобочитаемее просто создать цикл и выйти, если маркер найден:

for ( i=0; i < SIZE; i++ ) {
   scanf("%d", &markers[i]);
   if ( markers[i] == -1 ) {
      break;
   }
} 
Другие вопросы по тегам