Sscanf игнорирует дату '-' в строке даты - PullRequest
0 голосов
/ 19 июня 2020

У меня проблемы, когда я пытаюсь проверить информацию строки даты, код:

  char date[] = "1990-01-01";

  sscanf(date, "%d %d %d", &year, &month, &day)
  printf("%d-%d-%d", year, month, day);   

  //expected 1990-01-01
  // actual output 1990--1--1

он принимает символ '-' как минус для месяца и дня, как я могу его игнорировать при принятии значения? Я пробовал использовать% * - но он проигнорировал ввод всего числа, заранее спасибо

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Вы можете попробовать использовать преобразования sscanf:

#include <stdio.h>
#include <stdlib.h>

int main()
{

    char date[] = "1990-01-01";

    char year[4];
    char month[2];
    char day[2];
    char m1[1];
    char m2[1];
    
    sscanf(date, "%[^-]%[-]%[^-]%[-]%s", year, m1, month, m2, day);
    printf("%s %s %s \n", year, month, day);

    return 0;
}

Выполнение говорит:

gcc -o vd -Wall -pedantic -Wextra  vd.c
./vd
1990 01 01 

Вот лучшая программа, которая позволяет тестировать в командной строке с большим количеством проверок ввода:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{

    char year[4];
    char month[2];
    char day[2];
    char m1[1];
    char m2[1];
    int rc;

    if (argc != 2)
    {
        printf("usage: vd YYYY-MM-DD\n");
        return 1;
    }
    
    rc = sscanf(argv[1], "%4[0-9^-]%[-]%2[0-9^-]%[-]%2[0-9]", 
                             year, m1, month, m2, day);
    if (rc == 5)
        printf("%d %d %d \n", atoi(year), atoi(month), atoi(day));
    else
    {
        printf("Incorrect date format\n");
        return 1;
    }

    return 0;
}

Выполнение говорит:

./vd 1990-01-01
1990 1 1 
./vd 1990-12-12
1990 12 12 
./vd 1990-01
Incorrect date format
./vd 1990-ab-13
Incorrect date format

Вот улучшенная версия, которая учитывает комментарии @rici:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{

        char year[4];
        char month[2];
        char day[2];
        int rc;

    if (argc != 2)
    {
        printf("usage: vd YYYY-MM-DD\n");
        return 1;
    }
    
    rc = sscanf(argv[1], "%4[0-9]-%2[0-9]-%2[0-9]", 
                             year, month, day);
    if (rc == 3)
        printf("%d %d %d \n", atoi(year), atoi(month), atoi(day));
    else
    {
        printf("Incorrect date format\n");
        return 1;
    }

    return 0;
}

Выполнение:

./vd 1990-01-02
1990 1 2 
./vd 1990-12-12
1990 12 12 
./vd 1990-01
Incorrect date format
./vd 1990-db-13
Incorrect date format
./vd 1990--01-02
Incorrect date format
0 голосов
/ 19 июня 2020

Попробуйте использовать заполнение в sscanf() и printf().

#include <stdio.h>

int main(void) {
    char date[] = "1990-01-01";
    int year;
    int month;
    int day;

    sscanf(date, "%d %03d %03d", &year, &month, &day);
    printf("%d%03d%03d", year, month, day);

    return 0;
}

Обратите внимание, что я не использовал - в операторе printf(). Это не требуется здесь после использования заполнения.

Вы получите что-то вроде:

1990-01-01

Вы пытаетесь принять 01 как 01, но поскольку это целое число, не восьмеричное, все нули перед положительным числом будут удалены, и поэтому вы получаете 1 вместо 01. Это то, что я исправил в приведенном выше примере, используя нулевое заполнение.

...