Heibonna
#naukaprogramowania #cpp #jezykc
Mam string postaci "2412421|214123" jak wydobyć z tego dwa inty?
  • Najlepsze
  • Wszystkie komentarze
kozborn
kozborn
@Heibonna

albo coś prostego:

string t = "2412421|214123";
int a = 0, b =
Heibonna
Heibonna Autor
1
@LazyInitializationException: niestety nie.
@JimHalpert: Hmm może kiedyś XD
@elfo: Dziękuje, dobry pomysł
@kozborn: A ten pomysł z serii "Czemu na to nie wpadłem"
lionbest
@Heibonna: C++17 masz najszybsze std::from_chars, w twoim przypadku:

int a,b;
auto result_a = std::from_chars(str.data(),str.data()+str.size(),a);
auto result_b = std::from_chars(result_a.ptr+1,str.data()+str.size(),b);
jeżeli nie jesteś pewien stringa, to jak tam
elfo
elfo
0
@Heibonna: Jeśli znak '|' występuje zawsze to najprościej będzie wyszukać tego znaku, zrobić względem miejsca tego znaku dwa nowe substringi, a dalej to np atoi().
JimHalpert
@Heibonna: Ewentualnie jak chcesz się pobawić i nauczyć czegoś nowego, to jest jeszcze regex. Chociaż w tym przypadku to trochę przerost formy nad treścią ( ͡° ͜ʖ ͡°)
Defined
@Heibonna: albo można wykorzystać do tego sscanf, ale to trzeba pracować na char*:

string s = "2412421|214123";
int a, b;
sscanf(s.c_str(), "%d|%d", &a, &b);
Heibonna
Heibonna Autor
0
@Defined: @Heibonna: @elfo: Właśnie się zorientowałem, że "|" nie zawsze musi występować tzn albo wczytujesz "4124|4124" albo "132213", więc opcja z wczytywaniem stringa i późniejszy ewentualny podział na substringi będzie odpowiedniejszy.
Defined
@Heibonna: sscanf zwraca liczbę poprawnie pobranych wartości przekazanych w argumencie, więc można dać:

int x = sscanf(s.c_str(), "%d|%d", &a, &b);
I jak x == 1, to pobrało tylko a, jak x == 2 to porało a i b (jak 0, to string nie ma liczb).
JakTamCoTam
@Heibonna: do wyboru do koloru. Mi sie najbardziej podoba ta wersja z boostem:
http://www.martinbroadhurst.com/how-to-split-a-string-in-c.html