in sscanf
%s
получит только Saturday из-за пробела, тогда %d
попытается извлечь int
из March и, конечно, не сможет
, но вы можете сделать:
sscanf( dtm, "%[^0-9] %d %d", date, &day, &year );
или лучше
sscanf( dtm, "%49[^0-9] %d %d", date, &day, &year );
, чтобы не рисковать писать из даты (49, а не 50 чтобы оставить пробел для конечного нулевого символа).
Итак
#include <stdio.h>
#include <string.h>
int main()
{
int day, year;
char date[50], dtm[100];
strcpy( dtm, "Saturday March 25 1989" );
if (sscanf( dtm, "%49[^0-9]%d%d", date, &day, &year ) == 3) /* remove useless spaces in format */
printf("'%s' %d %d\n", date, day, year ); /* use '%s' to show all from date */
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
'Saturday March ' 25 1989
pi@raspberrypi:/tmp $
, как вы можете видеть, дата запоминает разделяющее пространство после даты до номера дня, этого невозможно избежать в вашем случае, потому что длина даты является переменной, но вы можете обойти возможные пробелы перед , используя sscanf( dtm, " %[^0-9]%d%d", date, &day, &year );
:
#include <stdio.h>
#include <string.h>
int main()
{
int day, year;
char date[50], dtm[100];
strcpy( dtm, " Saturday March 25 1989" );
if (sscanf( dtm, " %49[^0-9]%d%d", date, &day, &year ) == 3)
printf("'%s' %d %d\n", date, day, year );
return 0;
}
Составление и исполнение:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
'Saturday March ' 25 1989
pi@raspberrypi:/tmp $
Из этого dtm бесполезно, и вы можете сделать напрямую:
if (sscanf(" Saturday March 25 1989",
" %49[^0-9]%d%d", date, &day, &year ) == 3)