Słowne opisanie liczby, błąd "terminate called after throwing an instance of..." [C++]

0

Witam,
Mam zadanie, żeby napisać funkcję opisującą słownie jakąś liczbę (przesłaną jej jako argument). Rezultatem tej funkcji ma być string z tym opisem.
OK. Na razie udało mi się napisać funkcję do tego momentu, gdzie poprawnie opisuje ona ilość tysięcy i setek. I teraz pojawił się problem - przy opisywaniu dziesiątek (skomplikowane wyrażenie) dostaję taki błąd:
//"terminate called after throwing an instance of 'std::length_error'
what(): basic_string::S_create
Aborted (core dumped)"//

Widzę, że chodzi o coś z długością stringu... Ale o co? Przecież klasa sama rezerwuje sobie miejsce na znaki...

A oto mój program:

#include <iostream>
#include <string>
using namespace std;

string Slownie(int liczba);

int main()
{
    string slownie = Slownie(5225);
    cout << slownie;
}

string Slownie(int liczba)
{
    string opis;
    string jednostki[] = {"zero", "jeden", "dwa", "trzy", "cztery", "piec", "szesc", "siedem", "osiem", "dziewiec"
    "jedenascie", "trzynascie", "czternascie" "pietnascie", "szesnascie", "siedemnascie", "osiemnascie", "dziewietnascie"};
    string dziesiatki[] = {"dziesiec", "dziescia", "dziesci", "dziesci", "dziesiat", "dziesiat", "dziesiat", "dziesiat", "dziesiat"};
    string setki[] = {"zero", "sto", "dwiescie","trzysta", "czterysta", "piecset", "szescset", "siedemset", "osiemset", "dziewiecset"};
    string tysiace[] = {"zero", "tysiac", "tysiace", "tysiace", "tysiace", "tysiecy", "tysiecy", "tysiecy", "tysiecy", "tysiecy"};

    if(liczba < 0) {opis += "minus "; liczba = (-liczba);} // Dla liczb ujemnych

    if(liczba >= 1000) // Dla tysięcy
    {
        opis += jednostki[static_cast<int>(liczba / 1000)];
        opis += ' ';
        opis += tysiace[static_cast<int>(liczba / 1000)];
        opis += ' ';
    }

    if((liczba - static_cast<int>(liczba / 1000)) >= 100) // Dla setek
    {
        opis += setki[static_cast<int>((liczba - (static_cast<int>(liczba / 1000) * 1000)) / 100)];
        opis += ' ';
    }

    if(liczba - static_cast<int>((liczba / 1000) + liczba / 100) >= 20) // Dla dziesiatek
    {
        string liczba_dziesiatki = dziesiatki[static_cast<int>((liczba - ((static_cast<int>(liczba / 1000) * 1000) + (static_cast<int>(liczba / 100)) * 100)) / 100)]; // Tu mamy błąd
        opis += jednostki[static_cast<int>((liczba - ((static_cast<int>(liczba / 1000) * 1000) + (static_cast<int>(liczba / 100)) * 100)) / 100)];
        opis += liczba_dziesiatki;
        opis += ' ';
    }

    return opis;
}
 

Wiem, że mógłbym ten program wyposażyć w zmienne i nieco skrócić wyrażenia w operatorach [], ale myślę, że tak łatwiej będzie znaleźć błąd. Liczę na waszą pomoc.

0

Wiem, że mógłbym ten program wyposażyć w zmienne i nieco skrócić wyrażenia w operatorach [], ale myślę, że tak łatwiej będzie znaleźć błąd

No raczej nie łatwiej.

int i = static_cast<int>((liczba - ((static_cast<int>(liczba / 1000) * 1000) + (static_cast<int>(liczba / 100)) * 100)) / 100);
cout << i << endl;
string liczba_dziesiatki = dziesiatki[i]; // Tu mamy błąd
1

Wiem, że mógłbym ten program wyposażyć w zmienne i nieco skrócić wyrażenia w operatorach [], ale myślę, że tak łatwiej będzie znaleźć błąd.

Faktycznie, byłoby łatwiej.

Po co te wszystkie casty z inta na inta?

string liczba_dziesiatki = dziesiatki[static_cast<int>((liczba - ((static_cast<int>(liczba / 1000) * 1000) + (static_cast<int>(liczba / 100)) * 100)) / 100)]; // Tu mamy błąd

nie lepiej

string liczba_dziesiatki = dziesiatki[(liczba%100)/10];
1

Po co tam te wszystkie static cast? o_O int/int = int, zawsze.

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