Я пишу программу для задания в C курсе для начинающих. Я использую структуры. Вот код (изначально он длиннее, но здесь возникает ошибка):
typedef struct
{
int hours, minutes, seconds;
}time;
typedef struct
{
int id;
short cat, gender;
char name[SIZE]; //SIZE is defined with 64
time times[3];
}runner;
int main(){
int n, i, j;
/*User types the value of n*/
runner runners[n];
//Data entry
for(i = 0; i < n; ++i)
{
printf("\n\tRunner no. %d\n", i + 1);
printf("Type your name: ");
while((getchar()) != '\n'); //Buffer flush
scanf("%64[^\n]", runners[i].name); //I make sure the user can't overflow the array.
printf("Type your runner id: ");
scanf("%d", &runners[i].id);
printf("Type your category (1-. Amateur 2-. Professional): ");
//Here the string seemingly disappears
do
{
scanf("%d", &runners[i].cat);
if(!(runners[i].cat == 1) && !(runners[i].cat == 2))
printf("Incorrect data. Try again: ");
}while(!(runners[i].cat == 1) && !(runners[i].cat == 2));
printf("Type your gender (1-. Male 2-. Female): ");
do
{
scanf("%d", &runners[i].gender);
if(!(runners[i].gender == 1) && !(runners[i].gender == 2))
printf("The typed value is incorrect. Try again: ");
}while(!(runners[i].gender == 1) && !(runners[i].gender == 2));
printf("Type your records: \n");
for(j = 0; j < 3; ++j)
{
printf("\n\tRecord %d\n", j + 1);
printf("Hours: ");
scanf("%d", &runnerss[i].times[j].hours);
printf("Minutes: ");
do
{
scanf("%d", &runners[i].times[j].minutes);
if(runners[i].times[j].minutes > 59 || runners[i].times[j].minutes < 0)
printf("The typed value is incorrect. Try again: ");
}while(runners[i].times[j].minutes > 59 || runners[i].times[j].minutes < 0);
printf("Seconds: ");
do
{
scanf("%d", &runners[i].times[j].seconds);
if(runners[i].times[j].seconds > 59 || runners[i].times[j].seconds < 0)
printf("The typed value is incorrect. Try again: ");
}while(runners[i].times[j].seconds > 59 || runners[i].times[j].seconds < 0);
}
}
//End of data entry
//Let's print the data
for(i = 0; i < n; ++i)
{
char c[14], s[8];
switch(runners[i].cat)
{
case 1:
strcpy(c, "Amateur");
break;
case 2:
strcpy(c, "Professional");
break;
}
switch(runners[i].gender)
{
case 1:
strcpy(s, "Male");
break;
case 2:
strcpy(s, "Female");
break;
}
printf("\n\tRunner no. %d\n", i + 1);
printf("Name: %s\n", runners[i].name); //Nothing gets printed
printf("Gender: ");
puts(s);
printf("Category: ");
puts(c);
printf("Id: %d\n", runners[i].id);
for(j = 0; j < 3; ++j)
{
printf("\n\tTime %d\nHours: %d\nMinutes: %d\nSeconds: %d\n", j + 1, runners[i].times[j].hours, runners[i].times[j].minutes,
runners[i].times[j].seconds);
}
}
//End
return 0;
}
}
В конце я должен напечатать информацию, но строка исчезает. Я отладил и напечатал значение переменной после scanf, и похоже, что все в порядке, но до (или после, я не знаю) первого, пока строка заполняется нулевыми символами. Логика c звуковая, и я действительно не вижу, что происходит, возможно, что-то разрушает массив. Это довольно странно. Спасибо за любую помощь. Если это хоть что-то используется, я сейчас использую Manjaro Linux с G CC 9.3 и glib c 2.31.
Правка: добавлен остальной код.