• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Znajdowanie liczby w stringu C++

Object Storage Arubacloud
0 głosów
1,868 wizyt
pytanie zadane 9 lutego 2020 w C i C++ przez dario Nowicjusz (200 p.)

Witam,

 

Mam problem z wyświetleniem liczby w stringu  poprzez funkcję.

Chciałbym, żeby wyświetliło po kolei liczby znajdujące się w stringu a nie tak jak w moim kodzie poniżej po wypisaniu liczby skracało ją coraz bardziej:

 

#include <iostream>
#include <string>
#include<cstdlib>

using namespace std;

string znajdowanieLiczbywStringu (string wyraz, int pozycja)

{
    string liczbaWyraz;

        while (isdigit(wyraz[pozycja]))
        {
            liczbaWyraz+=wyraz[pozycja];
            ++pozycja;
        }

    return liczbaWyraz;

}

int main()
{
    string wyraz = "aa1234bb45cc66dd";

    int dlugosc = wyraz.length();

    for(int i = 0; i < dlugosc; i++)
    {
        cout << znajdowanieLiczbywStringu(wyraz, i)<<endl;

    }

    return 0;
}

 

komentarz 23 lutego 2021 przez Novoel Nowicjusz (100 p.)
Mam podobny problem przy czym u mnie konkretnie zależy mi na wyciągnięciu liczb z kolejnych linijek pliku.

Wygląda to tak, że mam:

Katowice 20

Buenos Aires 35

Krakow 17

itd.

Chodzi o to by wyciągnąć tylko liczby przypisane do miast i wykonać konkretne działanie na kolejnych liczbach. Mam problem z wyciągnięciem samych liczb i wstawienia ich do zmiennej. Konkretnie chodzi o konwertowanie temperatury z Farenheita na Celcjusze.

1 odpowiedź

+2 głosów
odpowiedź 9 lutego 2020 przez dawid2002 Mądrala (5,190 p.)

Najłatwiej jest to rozwiązać, sprawdzając po kolei, który znak jest cyfrą. Wystarczy, że gdy dla "i" równego np: 0 sprawdzamy czy jest cyfrą, jeśli tak wpisujemy tą cyfrę jeśli nie to pomijamy dany element string'a.

for (int i = 0; i < dlugosc; ++i)
{
    if (isdigit(wyraz[i]))
        std::cout << wyraz[i];
}

Zaś tamta funkcja, którą użyłeś ona jak odnalazła znak, który jest cyfrą to sprawdzała czy następny jest też jest cyfrą, i z tego wszystkiego wychodziło, że zwracała cyfry występujące obok siebie. Jeszcze w dodatku po wyświetleniu dałeś std::endl , który powodował przeskok do następnej linii.

PS. Miejmy nadzieje, że coś zrozumiałeś z tego mojego łopatologicznego tłumaczenia xd

komentarz 9 lutego 2020 przez dario Nowicjusz (200 p.)
Ok, rozumiem, tylko ja muszę mieć osobno liczby pomiędzy literami wypisane.

A w ten sposób wypisze mi wszystkie cyfry po kolei znajdujące się w stringu.
komentarz 9 lutego 2020 przez dawid2002 Mądrala (5,190 p.)

O ile dobrze rozumiem dla tego przykładu chciałbyś aby na ekranie się pojawiło:

1234
45
66

Jeśli tak to kod, który modyfikuje najmniej w twoim kodzie mógłby wyglądać tak:

for (int i = 0; i < dlugosc; ++i)
{
    std::string ZwroconyWyraz = znajdowanieLiczbywStringu(wyraz, i);

    if (!ZwroconyWyraz.empty())                       // 1
    {
        std::cout << ZwroconyWyraz << "\n";           // 2
        i += ZwroconyWyraz.length() - 1;              // 3
    }
}

1. Funkcja empty sprawdza czy napis jest pusty zaś z operatorem ! sprawdza czy nie jest pusty (dla pustego napisu nic nie robimy).

2. "\n" robi to samo co std::endl (choć słyszałem, że jest lepszy bo szybszy).

3. jeśli mamy np: liczbę "1234" to wyraz[2] jest równy "1" , a twoja funkcja po tej jedynce jeszcze weźmie 2, 3 i 4, więc po wywołaniu funkcji "i" powinno być równe 6 (obecna wartość "i" tutaj 2 + długość liczby tutaj 4), czyli następne wywołanie funkcji rozpocznie się od wyraz[6]. Umieściłem tam jeszcze "-1" a czy odejmiemy jedynkę bądź nie to i tak wynik będzie taki sam, ponieważ u mnie odejmując jedynkę wychodzi wartość 5 ale pętla po zakończeniu iteracji inkrementuje "i" i wychodzi znowu 6. Gdyby nie byłoby odejmowania następna iteracja rozpoczęłaby się z "i" równy 7. W mojej wersji wszystko jest dokładnie sprawdzane, ale w wersji bez odejmowania wynik jest ten sam, ale napis jest aż tak dokładnie sprawdzany.

Na koniec powiem, że program byłoby można napisać bardziej logicznie, ale ze względu, że jest wieczór (wtedy kiedy ja to piszę) to dałem ci taką mniej zmodyfikowaną wersje. Na twoim miejscu bardziej bym przebudował program. Logiczniej byłoby gdyby funkcja zwracała wartość bool (false gdy zmienna funkcji wyraz jest pusta i true w przeciwnym wypadku) a sam napis powinnien być przekazany przez referencję (albo jakaś inna koncepcja na napisanie funkcji).

Podobne pytania

0 głosów
1 odpowiedź 885 wizyt
pytanie zadane 17 października 2019 w C# przez pitersooon98 Nowicjusz (200 p.)
0 głosów
2 odpowiedzi 658 wizyt
pytanie zadane 13 kwietnia 2019 w C# przez MakaBresk Obywatel (1,060 p.)
0 głosów
2 odpowiedzi 812 wizyt

92,554 zapytań

141,400 odpowiedzi

319,537 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...