在sscanf %s 将只得到 Saturday 因为空间然后%d 将尝试从 March 中提取 int 当然不能
但你可以这样做:
sscanf( dtm, "%[^0-9] %d %d", date, &day, &year );
或更好
sscanf( dtm, "%49[^0-9] %d %d", date, &day, &year );
不要冒险写出 date(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)