繁体   English   中英

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

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

我的程序应该询问用户上次满月的日期,检查数据是否正确,然后询问用户他是否想查看下一个或上一个满月的日期以及有多少。 我对“if”和“else if”有一些问题。 我不知道为什么,但程序基本上表现得好像它没有看到用户在这一行中提供了任何东西scanf_s("%s", &czy_kolejne); 并直接进入else{printf("\nBłędny znak."); } else{printf("\nBłędny znak."); } 我也不确定日期结构是否是最好的方法,因为它与以前的日期有一些问题。 有人可以给我任何建议吗?

#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;
}

czy_kolejne的数据类型为char时, scanf_s("%s", &czy_kolejne)至少有两件事是错误的:

首先, %s将读入一个以0结尾的字符串,但您提供了一个char类型的缓冲区; 这是未定义的行为,很可能只是破坏了 memory 并导致奇怪的结果。 要读取一个字符,请使用格式"%c"

其次,如果您将czy_kolejne设置为 char 数组,例如char czy_kolejne[10] ,则使用格式%s scanf_s是可以的,但它需要一个指示缓冲区大小的附加参数。 即你必须写scanf_s("%s", &czy_kolejne, sizeof(czy_kolejne))

暂无
暂无

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

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