У вас есть цикл печати внутри цикла чтения. Он пытается распечатать всю информацию о поездке после прочтения первого в.
Редактировать: Проблема в том, что способ scanf
обработки одиночных символов является довольно неинтуитивным по сравнению с тем, как он обрабатывает строки и числа. Он читает следующий символ из стандартного in, который, вероятно, является символом новой строки после того, как вы закончили ввод предыдущего ввода. Затем он пытается прочитать целое число, но вместо этого находит письмо, которое вы намеревались использовать в %c
. Это приводит к сбою scanf
и не инициализирует stop_num
.
Одним из способов решения этой проблемы может быть чтение строки. scanf
начнет читать строку с первого непробельного символа и прекратит читать его с первого символа пробела. Затем просто возьмите первый символ из буфера, в который вы прочитали строку.
#include <stdio.h>
#define MAX 3
#define MAXTRIP 6
struct stop {
float cost;
float time;
};
struct trip {
char Dest_letter;
int stop_num;
struct stop leg[MAX];
};
int main(void)
{
int trip_num, index, i;
struct trip travel[MAXTRIP];
char buffer[10];
printf("Enter number of trips: ");
scanf("%d", &trip_num);
for (index = 0; index < trip_num; index++) {
printf("Please enter destination letter/number of stops:\n");
scanf("%s %d", buffer, &travel[index].stop_num);
travel[index].Dest_letter = buffer[0];
for (i = 0; i < travel[index].stop_num; i++){
printf("Please enter cost/length of stop %d:\n", i);
scanf("%f %f", &travel[index].leg[i].cost, &travel[index].leg[i].time);
}
}
printf("%d trips\n", trip_num);
for (index = 0; index < trip_num; index++) {
printf("Trip:%d \nDestination Letter:%c\n", index + 1, travel[index].Dest_letter);
for (i = 0; i < travel[index].stop_num; i++)
printf("Cost:%.2f \nLength:%.2f\n", travel[index].leg[i].cost, travel[index].leg[i].time);
}
}