Вы можете попробовать использовать преобразования 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