简体   繁体   中英

How can I fix the If and structure problem in C?

My program should ask user for last full moon date, check if data is correct and then ask user does he want to see dates of next or previouse full moons and how many. I have some problems with "if"and "else if". I don't know why but program basiclly acts like it doesn't see that user gave anything in this line scanf_s("%s", &czy_kolejne); and goes straight to else{printf("\nBłędny znak."); } else{printf("\nBłędny znak."); } . I'm also not sure if structure for date is the best way to do it, becasue it have some problem with previouse dates. Could someone give me any advice?

#include<time.h>
#include<stdlib.h>

int main()
{
    int rok, miesiac, dzien;
    char czy_kolejne;
    int kolejne_pelnie;
    int poprzednie_pelnie;
    printf_s("Kiedy byla ostatnia pelnia ? (DD.MM.YYYY): ");
    scanf_s("%d.%d.%d", &dzien, &miesiac, &rok);

    if (rok >= 0)
    {
        if (miesiac >= 1 && miesiac <= 12)
        {
            if ((dzien >= 1 && dzien <= 31) && (miesiac == 1 || miesiac == 3 || miesiac == 5 || miesiac == 7 || miesiac == 8))
            {
                printf_s("Poprawna data. %d.%02d.%d", dzien, miesiac, rok);
            }
            else if ((dzien >= 1 && dzien <= 31) && (miesiac == 10 || miesiac == 12))
            {
                printf_s("Poprawna data. %d.%d.%d", dzien, miesiac, rok);
            }
            else if ((dzien >= 1 && dzien <= 30) && (miesiac == 4 || miesiac == 6 || miesiac == 9))
            {
                printf_s("Poprawna data. %d.%02d.%d", dzien, miesiac, rok);
            }
            else if ((dzien >= 1 && dzien <= 30) && miesiac == 11)
            {
                printf_s("Poprawna data. %d.%d.%d", dzien, miesiac, rok);
            }
            else if ((dzien >= 1 && dzien <= 28) && miesiac == 2)
            {
                printf_s("Poprawna data. %d.%02d.%d", dzien, miesiac, rok);
            }
            else if (dzien == 29 && miesiac == 2 && (rok % 400 == 0 || (rok % 4 == 0 && rok % 100 != 0)))
            {
                printf_s("Poprawna data. %d.%02d.%d", dzien, miesiac, rok);
            }
            else
            {
                printf_s("Liczba dni w miesiacu jest bledna.");
            }
        }

        else
        {
            printf_s("Nie ma tylu miesiecy.");
        }
    }

    struct tm  t = { 0 };
    t.tm_mday = dzien;
    t.tm_mon = miesiac - 1;
    t.tm_year = rok - 1900;
    int skip = 29;
    t.tm_mday += skip;
    mktime(&t);
    char buffer[30];

    printf("\nCzy wyliczyc daty kolejnych pelni ? (T/N)");
    scanf_s("%s", &czy_kolejne); //The problem starts right here.//

    if ((czy_kolejne=='t') || (czy_kolejne=='T'))
    {

        printf_s("\nIle dat w przod?");
        scanf_s("%d", &kolejne_pelnie);
        for (int i = 1; i <= kolejne_pelnie; i++)
        {
            int skip = 29 * i;
            t.tm_mday += skip;
            strftime(buffer, 30, "\n%d-%m-%Y", &t);
            puts(buffer);
        }
    }
    else if ((czy_kolejne=='n') || (czy_kolejne=='N'))
    {

        printf_s("\nIle dat w tył wyliczyc?");
        scanf_s("%d", &poprzednie_pelnie);
        for (int i= 1; i <= poprzednie_pelnie; i++)
        {
            int skip = 29 * i;
            t.tm_mday -= skip;
            strftime(buffer, 30, "\n%d.%m.%Y", &t);
            puts(buffer);
        }
    }
    else
    {
        printf("\nBłędny znak.");
    }


    return 0;
}

At least two things are wrong with scanf_s("%s", &czy_kolejne) , when czy_kolejne is of datatype char :

First, %s will read in a 0 -terminated string, but you provide a buffer of type char ; this is undefined behaviour, very likely just corrupting memory and leading to weird results. For reading in exactly one character use format "%c" .

Second, if you make czy_kolejne to a char array, eg char czy_kolejne[10] , then scanf_s with a format %s is OK, but it requires an additional argument indicating the buffer size. Ie you'd have to write scanf_s("%s", &czy_kolejne, sizeof(czy_kolejne)) .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM