简体   繁体   English

如何解决 C 中的 If 和结构问题?

[英]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".我对“if”和“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);我不知道为什么,但程序基本上表现得好像它没有看到用户在这一行中提供了任何东西scanf_s("%s", &czy_kolejne); and goes straight to else{printf("\nBłędny znak."); }并直接进入else{printf("\nBłędny znak."); } 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 :czy_kolejne的数据类型为char时, scanf_s("%s", &czy_kolejne)至少有两件事是错误的:

First, %s will read in a 0 -terminated string, but you provide a buffer of type char ;首先, %s将读入一个以0结尾的字符串,但您提供了一个char类型的缓冲区; this is undefined behaviour, very likely just corrupting memory and leading to weird results.这是未定义的行为,很可能只是破坏了 memory 并导致奇怪的结果。 For reading in exactly one character use format "%c" .要读取一个字符,请使用格式"%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.其次,如果您将czy_kolejne设置为 char 数组,例如char czy_kolejne[10] ,则使用格式%s scanf_s是可以的,但它需要一个指示缓冲区大小的附加参数。 Ie you'd have to write scanf_s("%s", &czy_kolejne, sizeof(czy_kolejne)) .即你必须写scanf_s("%s", &czy_kolejne, sizeof(czy_kolejne))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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