Jak sparsować string?

0

Potrzebuję taką funkcjonalność:

#include <stdio.h>
#include <iostream>
#include <string>

int main ()
{
  char sentence []="{ 42, LE_CUP, 1 }";
  char s[20];
  int i;
  int j;

  sscanf (sentence,"{ %d, %s, %d }",&i,s,&j);
  std::cout << i << std::endl;
  std::cout << s << std::endl;
  std::cout << j << std::endl;
  return 0;
}

Ale mi to nie działą bo output jest:

42
LE_CUP,
0

zamiast

42
LE_CUP
1

Może jakimś forem szukając białego znaku i przecinka?

3

Zamiast kazać czytać do białego znaku %s, możesz kazać czytać do przecinka %[^,]:

#include <stdio.h>
#include <iostream>
#include <string>

int main ()
{
  char sentence []="{ 42, LE_CUP, 1 }";
  char s[20];
  int i;
  int j;

  sscanf (sentence,"{ %d, %[^,], %d }",&i,s,&j);
  std::cout << i << std::endl;
  std::cout << s << std::endl;
  std::cout << j << std::endl;
  return 0;
}

Wynik:

42
LE_CUP
1
1

Co do "sparsować" ... o ile pozostaniesz w podobnym zakresie złożoności, sscanf można uznać za "parsowanie"
Ale wymięknie jak złożoność pojedzie w górę.

C++ ma znaczne możliości tworzenia ładnych, czytelnych parserów, od ambitnego C++ boost:spirit (ośmieliłbym się dla mniejszych rzeczy,. wyrażeń) po np AntLR (dowolnie duże, i zachowuje elegancję, debugoalnosc)
Dałem to zdanie bo (efektywnie) używasz C - i ujawniasz że standardowe C++ ma słabość w tych zagadnieniach :)

1

Jeden przykład wejścia nie pozwala stwierdzić jaka powinna być gramatyka wejścia.
Przydało by się pełne wyjaśnienie jakie jest możliwe wejście. Czy to LE_CUP to jest wyjątek, czy reguła? Może wystąpić na każdej pozycji, czy tylko an drugie? Czy na drugiej pozycji może być cos co nie jest tekstem, ale liczby.

1 użytkowników online, w tym zalogowanych: 0, gości: 1