использовать `sscanf` так же, как` istringstream`?

0

Используя istringstream, мы могли бы читать элементы один за другим из строки, например:

istringstream iss("1 2 3 4");
int tmp;
while (iss >> tmp) {
    printf("%d \n", tmp);  // output: 1 2 3 4
}

мы могли бы сделать это с помощью sscanf?

Теги:
scanf
istringstream

2 ответа

2
Лучший ответ

Вы можете довольно точно имитировать это с помощью этого

const char *s = "1 2 3 4";
int tmp, cnt;

for (const char *p = s; sscanf(p, "%d%n", &tmp, &cnt) == 1; p += cnt)
  printf("%d\n", tmp);
  • 0
    Я не уверен, считается ли %n по sscanf . Я бы сделал тест >= 1 вместо этого.
  • 0
    @Basile Starynkevitch: это не считается. В спецификации говорится: «Выполнение директивы %n не увеличивает счет присваивания, возвращаемый при завершении выполнения функции fscanf ».
Показать ещё 3 комментария
2

Если вы можете разбить строку на отдельные токены, используя strtok

  char str[] ="1 2 3 4";
  char * pch;
  pch = strtok (str," ");
  while (pch != NULL)
  {
    int tmp;
    sscanf( pch, "%d", &tmp );
    printf( "%d \n", tmp );
    pch = strtok (NULL, " ");
  }

В противном случае scanf поддерживает преобразование% n, которое позволит вам подсчитать количество потребляемых символов до сих пор (я не тестировал это, могут быть ошибки, которые я не рассматривал);

  char str[] ="1 2 3 4";
  int ofs = 0;
  while ( ofs < strlen(str) )
  {
    int tmp, ofs2;
    sscanf( &str[ofs], "%d %n", &tmp, &ofs2 );
    printf( "%d \n", tmp );
    ofs += ofs2;
  }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню