Получение правильного формата sscanf для печати строки и целых чисел - PullRequest
0 голосов
/ 01 августа 2020

Как должен выглядеть аргумент sscanf, если я хочу, чтобы вывод оператора печати был: Saturday March 25 1989

Другими словами, я хочу, чтобы date содержал как Saturday И March. Я пробовал разные варианты формата sscanf, но инструкция печати обычно выходит gibberi sh.

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

1 Ответ

2 голосов
/ 01 августа 2020

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