цикл for принимает одно дополнительное значение, чем условие цикла

#c #arrays #for-loop #scanf

#c #массивы #for-цикл #сканф

Вопрос:

Я написал программу, которая принимает значение от пользователя, а затем выполняет итерацию по этому значению в цикле for. в цикле for я принимаю числа, которые будут сохранены в массиве. Моя проблема в том, что цикл for принимает одно дополнительное значение, отличное от указанного пользователем.

 int main()
{
  int  i = 0;
  int  a;
  int no_of_boxcars = 0;
  double array[10];
  double boxcart_wt = 0;
  //printf("Enter the no of wagons");
  scanf_s("%d", amp;no_of_boxcars);        // no of boxcars
  for (i = 0; i<=no_of_boxcars;  i)
  {
    printf("%d t", i);
    scanf_s("%lf ", amp;boxcart_wt);   //weight in boxcar

    array[i] = boxcart_wt;
  }
}
 

если пользователь вводит 3, он должен принимать 3 значения, если

 for (i = 0; i<no_of_boxcars;  i)
{
  //but here accepts 4 values
}
 

если пользователь вводит 3, он должен принимать 4 значения, если

 for (i = 0; i<=no_of_boxcars;  i)
{
  //and here accepts 5 values
}
 

Комментарии:

1. » одно дополнительное значение «: < не совпадает с <= .

2. Для no_of_boxcars того, чтобы быть равным 3 , этот цикл for (i = 0; i < no_of_boxcars; i) { ...} повторяется ровно три раза.

3. @xing, спасибо, вы правы, это была проблема. теперь я работаю

4. @alk, да, вы правы, они не совпадают, но мой вопрос заключался в том, что мой цикл принимал одно дополнительное значение, чем ожидалось. Поэтому, если я удалю пробел в конце из «%lf», тогда он будет работать идеально.

Ответ №1:

Индексы в C идут от 0..n-1 . В вашем цикле for вы переходите из 0..n , и это слишком много. Изменить

 for (i = 0; i<=no_of_boxcars;  i)
 

Для

 for (i = 0; i<no_of_boxcars;  i)
 

Комментарии:

1. проблема не в цикле for, а в том, что когда я принимаю значение внутри цикла for, у него есть пробел «%lf » после %lf . итак, после удаления этого пробела он работал нормально

2. @AmeyaPatil, ваша проблема также была в циклическом тестировании, и вопрос озаглавлен как таковой … не говорите сейчас, что проблема не рассматривается в этом ответе. Ошибка, о которой сообщается в этом ответе, также является ошибкой. Жаль, что вы отказываетесь от ответа Пола … поскольку вы ясно заявили, что ваша программа запрашивала одно дополнительное значение.

3. @LuisColorado, я принимаю свою ошибку, но в приведенных случаях четко указано, в чем заключалась проблема.

4. @PaulOgilvie, ваш ответ в некотором смысле касался вопроса, но проблема была на шаг впереди этого. Я тоже уважаю ваш ответ.

Ответ №2:

Пробел в scanf формате соответствует любому пробелу и любому количеству последовательных пробелов.

Проблема с конечным пробелом заключается в том, что then scanf должен продолжать чтение, пока не прочитает что-то, что не является пробелом, иначе он не знает, когда заканчиваются пробелы.

Это приводит к проблеме, заключающейся в том, что вам нужно ввести дополнительные данные, не содержащие пробелов.

Для всех форматов, кроме двух ( "%c" и "%[" ) scanf , функция автоматически считывает и отбрасывает начальные пробелы. Поэтому обычно не требуется включать пробелы в строку формата. За исключением, возможно, тех двух форматов, которые не пропускают пробелы.

Прочитайте, например, эту scanf (и семейную) ссылку для получения более подробной информации.