LINUX.ORG.RU

флаг '*' sscanf


0

0

Подскажите как ползоваться этой вещью. В мане написано
что этот флаг подавляет присваивание через указатели а
в остальном работает как обычно. Например такой код:

$ cat ./scnf.c

#include <stdio.h>

int main(int argc, char **argv)
{
char *str = "ABC", *fmt = "%*s", *ptr = NULL;

printf("sscanf(\"%s\", \"%s\", %p); %i\n",
str, fmt, ptr, sscanf(str, fmt, ptr));

return 0;
};

Я ожидаю, что sscanf вернет 1, а он :
$ ./scnf
sscanf("ABC", "%*s", (nil)); 0

Чего я не понимаю?

anonymous

читаем man:

 *      Suppresses  assignment.  The conversion that follows occurs as usual, but no
        pointer is used; the result of the conversion is simply discarded.

RETURN VALUE
...
Zero indicates that, while there was input available, no conversions were assigned;

Так что вроде все верно

phoenix ★★★★
()
Ответ на: комментарий от phoenix

Тогда как мне определить совпала строка с шаблоном "%*s" или нет.
Сама строка мне не нужна. Вроде 0 обычно возвращается когда строка
не совпадает с шаблоном?

anonymous
()
Ответ на: комментарий от anonymous

>sscanf("ABC", "%*s", (nil))

третий параметр тут лишний.
sscanf Возвращает число считанных полей.
%*s - дает команду sscanf проверить
поле на соответствие формату, но не записывать в переменную, например

  char a[16], b[16];
  int n;
  
  n = sscanf("A B C","%s%*s%s",a,b);
  printf("n = %d, a = %s, b = %s\n",n,a,b);

printf напечатает 2, A, C

>Тогда как мне определить совпала строка с шаблоном "%*s" или нет.
>Сама строка мне не нужна. Вроде 0 обычно возвращается когда строка
>не совпадает с шаблоном?

Для случая "%*s" вернет 0, если
есть непробельные символы, если их нет, то sscanf при поиске
непробельных символов упрется в конец строки (файла) и вернет EOF

  n = sscanf(" ","%*s");
  printf("n = %d\n",n);

printf напечатает -1.

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.