Dodatkowe znaki przy losowaniu ciągu znaków

0

Cześć,
Piszę swoją pierwszą apkę okienkową w C++ Builderze 6 i na początek postanowiłem zrobić prosty generator ciągu znaków. W zamyśle chciałem losować liczby z przedziału 33-122 i w zależności od zaznaczonych checkboxów (dodatkowe opcje - duże litery, cyfry, znaki specjalne) decydować o przedziałach z których mają być losowane znaki, jednak musiałem poradzić sobie inaczej.
Aktualnie program losuje ciągi cyfr zamieniane na ASCII, jednak przy różnych długościach (2, 4, 8, 12, 16, 20, 21 , 24) dodawane są dodatkowe znaki, w ilości od jednego do dwóch. Nie mam pojęcia czym jest to spowodowane, może coś namotałem w kodzie:

 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        srand(time(0));
        int dlugosc = Edit1->Text.ToInt();
        char *output = new char[dlugosc];
        int los, lotto;

        if(dlugosc>5 && dlugosc<29)
        {
        if(!(CheckBox1->Checked) && !(CheckBox2->Checked) && !(CheckBox3->Checked))
        {
                for(int i=0;i<dlugosc;i++)
                {
                        los = (rand()%26)+97;   //male
                        output[i] = los;
                        Edit2->Text = output;
                 }
                 //Edit2->Text = output;
                 delete output;
        }

        if(CheckBox1->Checked && !(CheckBox2->Checked) && !(CheckBox3->Checked))
        {
                for(int i=0;i<dlugosc;i++)
                {
                        lotto = rand()%2;
                        if(lotto==0)
                        {
                                los = (rand()%26)+97;   //male
                                output[i] = los;
                        }
                        else
                        {
                                los = (rand()%26)+65;   //duze
                                output[i] = los;
                        }
                        Edit2->Text = output;
                 }
                 delete output;
        }

}

Image and video hosting by TinyPic

No i tak dalej dla wszystkich kombinacji checkboxów :D Co można na to poradzić?

3

Mamy rok 2016, nie 2002. C++ Builder 6 to antyk.

char *output = new char[dlugosc];
// ... 
delete output;

UB, new[] trzeba parować z delete[] a nie delete. Jeśli już przy tym jesteśmy, nagie new i delete to antyidiom w C++, używaj smart pointerów/kontenerów. W tym przypadku np. std::string.

if(!(CheckBox1->Checked) && !(CheckBox2->Checked) && !(CheckBox3->Checked))

Czytelność tego kodu poraża. Nadawaj sensowne nazwy zmiennym.

  1. Popraw formatowanie. Jeśli nie umiesz sam ⟶ http://format.krzaq.cc

lotto = rand()%2;

https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
używaj <random> jeśli możesz

los = (rand()%26)+97;

Magic numbers. W czym 97 jest lepsze od 'a'?

  1. Sedno problemu: nie kończysz C stringa znakiem '\0', więc wczytujesz śmieci z pamięci (btw: UB) aż do napotkania takiego. Gdybyś zastosował się do powyższych rad nie miałbyś takiego problemu.
0

Poradziłem sobie, zrobiłem mały myk:

    char* output = new char[dlugosc+1];
    output[dlugosc] =  '\0';

Zastosowałem się też do parowania z podpunktu 1, ale nie mam pojęcia jak możnaby to zrobić z użyciem std::string (ale chętnie się dowiem). Podpunkt 5 w ogóle nie przyszedł mi do głowy :). Dzięki wielkie za pomoc!

0
   AnsiString str;
   str.SetLength(3);
   str[1]='A';
   str[2]='b';
   str[3]='c';

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