Строка, по-видимому, исчезает в C при использовании структур - PullRequest
0 голосов
/ 01 мая 2020

Я пишу программу для задания в 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.

Правка: добавлен остальной код.

1 Ответ

0 голосов
/ 01 мая 2020

Проблема была в спецификаторе формата. Я объявил короткие переменные как int, и это остановило исчезновение строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...