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

Niechciane znaki w łańcuchu

0 głosów
208 wizyt
pytanie zadane 18 lipca 2016 w C i C++ przez niezalogowany

Ostatnio postanowiłem napisać sobie prosty program zamieniający liczby podane przez użytkownika na złote. Ustawiłem wszystko tak jak chciałem program działa w większości przypadków gdy podaje liczbę 23 wyświetla 23 zł itp. Gdy podam jakąś literę wtedy program wraca na początek, ale gdy podam coś w stylu "2s2" program wyświetla to jako "2s2 zł". Chciałbym aby jedynym akceptowanym znakiem przez program oprócz cyfr była kropka.

#include <iostream>

using namespace std;

void pieniadze(string lancuch); //prototyp funkcji

int main()
{
    bool dalej;
    dalej = true;
    do
    {
        cin.clear();
        cin.sync();

        string napis;
        cout << "Podaj liczbe ktora mam zamienic na PLN ";
        getline(cin,napis);

        int dlugosc;
        dlugosc = napis.length();

        for (int i=0; i<dlugosc; i++)
        {
            if (napis[i]<45||napis[i]==46||napis[i]==47||napis[i]>57)
                dalej = false;
            else
                dalej = true;
        }

        if (dalej==true)
            pieniadze(napis);


    }
    while(dalej==false);

    return 0;
}
void pieniadze(string lancuch)
{
    char kropka = '.';
    size_t szukaj = lancuch.find(kropka);

    if (szukaj!=string::npos)
    {
        string zlote = lancuch.substr(0,szukaj);
        lancuch.erase(0,szukaj+1);

        int dlugosc_lancucha = lancuch.length();
        if (dlugosc_lancucha>2)
            lancuch.erase(2,dlugosc_lancucha-2);
        else if (dlugosc_lancucha==1)
            lancuch.insert(0,"0");
        cout << zlote << " zl " << lancuch << " gr";
    }
    else
        cout << lancuch << " zl";
}

 

1 odpowiedź

0 głosów
odpowiedź 18 lipca 2016 przez MichuDev Pasjonat (20,300 p.)
wybrane 18 lipca 2016
 
Najlepsza
  • Aby kod dobrze działał powinieneś dołączyć nagłówek <string> w którym znajduje się klasa basic_string<> oraz jej konkretyzacje takie jak string,wstring,u16string,u32string, oraz metody do konwersji pomiędzy typami łańcuchowymi a numerycznymi i odwrotnie, nie zapominając o klasie cech typowych char_traits<>.
  • Zamiast kropki lepiej użyć obiektu locale, który sprawi, że można użyć innych separatorów dziesiętnych zależnie od języka, kultury, kraju.
  • Warto użyć algorytmu find_if z argumentami str.cbegin(),str.cend() oraz funkcją lub lambdą sprawdzającą czy to liczba lub separator dziesiętny.
  • Standard języka definiuje również inne sposoby, pamiętaj by nie używać nic powodującego "niezdefiniowane zachowanie" (zdefiniowane przez implementacje, nie przez standard języka).

Podobne pytania

0 głosów
1 odpowiedź 1,583 wizyt
0 głosów
1 odpowiedź 260 wizyt
pytanie zadane 29 grudnia 2016 w Rozwój zawodowy, nauka, praca przez kroliczysyn Początkujący (390 p.)
0 głosów
2 odpowiedzi 5,689 wizyt
pytanie zadane 11 grudnia 2018 w C i C++ przez Draq Nowicjusz (160 p.)

93,632 zapytań

142,556 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...