获取正确的 sscanf 格式以打印字符串和整数

Getting the correct sscanf format to print a string and integers

如果我希望 print 语句的输出为:Saturday March 25 1989

,那么 sscanf 参数应该是什么样子的?

换句话说,我希望 date 包含 SaturdayMarch。我尝试了不同的 sscanf 格式选项,但打印语句通常会出现乱码。

int day, year;
char date[50], dtm[100];
strcpy( dtm, "Saturday March 25 1989" );
sscanf( dtm, "%s %d %d", date, &day, &year );

printf("%s %d %d\n", date, day, year );

in sscanf %s 将仅获得 Saturday 因为 space 然后 %d 将尝试提取 int 3 月 当然不能

但你可以这样做:

sscanf( dtm, "%[^0-9] %d %d", date, &day, &year );

或更好

sscanf( dtm, "%49[^0-9] %d %d", date, &day, &year );

不要冒险写出 date(49 而不是 50 让 space 作为结束空字符)。

所以

#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 $ 

如您所见,日期会记住 space 日期之后的天数,在您的情况下无法避免这种情况,因为日期的长度是可变的,但您可以使用 sscanf( dtm, " %[^0-9]%d%d", date, &day, &year ); 绕过可能的 spaces before :

#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)