【问题标题】:Getting the correct sscanf format to print a string and integers获取正确的 sscanf 格式以打印字符串和整数
【发布时间】:2020-08-01 13:24:01
【问题描述】:

如果我希望打印语句的输出为:Saturday March 25 1989sscanf 参数应该是什么样子的:Saturday March 25 1989

换句话说,我希望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 );

【问题讨论】:

  • Sarah,“...包含SaturdayMarch”需要详细信息。 date[] 应该包含“Saturday March”、“Saturday March”、(注意尾随空格)还是什么?如果dtm[]` 以空格开头怎么办?

标签: c printf scanf


【解决方案1】:

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, &amp;day, &amp;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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多