-1

Как объявить "char password_value[1000] = "";" от "password_length"?

Как сложить "password_value += password_chars[j];" ?

Так выдает ошибку, а если я использую "strcat(password_value += password_chars[j]);", то вместо 2 символов получаю почему-то больше.

if(!error)
    {
            char s_russian[33] =
            {
                    "àáâãä叿çèéêëìíîïðñòóôõöøùúûüýþÿ"
            };
            char s_latin[27] =
            {
                    "abcdefghijklmnopqrstuvwxyz"
            };
            char S_RUSSIAN[33] =
            {
                    "ÀÁÂÃÄŨÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞß"
            };
            char S_LATIN[27] =
            {
                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            };
            char s_num[11] =
            {
                    "0123456789"
            };
            char s_esc[27] =
            {
                    "`~@#¹$;%^:&?*()-_=+|[{]}<>"
            };


            char password_chars[153] = "";


            if(CheckBox1->Checked == true && CheckBox3->Checked == true)
            {
                   strcat(password_chars, s_russian);
            }
            if(CheckBox2->Checked == true && CheckBox3->Checked == true)
            {
                    strcat(password_chars, s_latin);
            }
            if(CheckBox1->Checked == true && CheckBox4->Checked == true)
            {
                    strcat(password_chars, S_RUSSIAN);
            }
            if(CheckBox2->Checked == true && CheckBox4->Checked == true)
            {
                    strcat(password_chars, S_LATIN);
            }
            if(CheckBox5->Checked == true)
            {
                    strcat(password_chars, s_num);
            }
            if(CheckBox6->Checked == true)
            {
                    strcat(password_chars, s_esc);
            }


            int i = 1;
            int password_length = StrToInt(Edit1->Text);


            int j = 0;
            int password_chars_length = strlen(password_chars);


            char password_value[1000] = "";


            for(i = 1; i <= password_length; i++)
            {
                    j = rand() % password_chars_length + 0;
                    password_value += password_chars[j];

            }


            Edit2->Text =  password_value;
    }

Изменил вот так, теперь выводит кракозябры и ругается на память на delete спустя нескольких вызовов.

            char * password_value = new char[password_length + 1];


            for(i = 1; i <= password_length; i++)
            {
                     j = rand() % password_chars_length;
                     password_value += password_chars[j];

            }


            password_value[password_length] = 0;


            Edit2->Text =  password_value;


            delete[] password_value;

Выбираю цифры, длина 22, рандом выводит "abOrder" и прочую чушь

aaa
  • 860

1 Answers1

3

Попробуйте так

for(i = 0; i < password_length; i++)
{
    j = rand() % password_chars_length;
    password_value[i] = password_chars[j];
}
password_value[password_length] = 0;

Сделать password_value длиной password_length можно только динамически

password_value = new char[password_length+1];

но потом надо не забыть освободить память... или просто использовать string password_value. Тогда

for(i = 0; i < password_length; i++)
{
    j = rand() % password_chars_length;
    password_value += password_chars[j];
}
Harry
  • 221,325
  • password_value[password_length] = 0; а это что? – aaa Oct 15 '16 at 17:30
  • может password_value[password_length + 1] = 0; – aaa Oct 15 '16 at 17:31
  • В C/C++ индексация начинается с нуля. Так что именно password_value[password_length] = 0 - это будет password_length+1-ый символ. – Harry Oct 15 '16 at 17:33
  • А так rand идёт от 0? – aaa Oct 15 '16 at 17:34
  • [C++ Error] Unit1.cpp(124): E2451 Undefined symbol 'password_value' при объявлении динамически – aaa Oct 15 '16 at 17:35
  • rand() возвращает значение от 0 до RAND_MAX включительно. RAND_MAX теоретически зависит от компилятора. – Harry Oct 15 '16 at 17:36
  • А вы его объявили как char*? Или вы намеки считаете готовым кодом, к которому надо приложить только руки, но не голову? :) – Harry Oct 15 '16 at 17:37
  • char * password_value = new char[password_length + 1]; Так?) – aaa Oct 15 '16 at 17:38
  • Да, так. только не забудьте потом освободить память, когда станет не нужна, как delete[] password_value; – Harry Oct 15 '16 at 17:40
  • Когда вызываю по клику на кнопку, ругается на память и в строке delete [] password_value;. Более того выводит кракозябры и через раз, то пусто то выводит. Код прикреплю в конец поста – aaa Oct 15 '16 at 17:44
  • Выбираю цифры, длина 22, выводит "abOrder" – aaa Oct 15 '16 at 17:49
  • Где то ошибка в памяти, что оно достаёт чуть ли не борландские настрйоки мне в edit (fontChars) и после нескольких вызовов ругался на borlandmm.dll – aaa Oct 15 '16 at 17:54
  • А Edit2->Text у вас какого типа? – PinkTux Oct 15 '16 at 18:04
  • Кракозябры - скорее проблема в кодировке. В Вашей системе я не знаю, как именно работает Edit2->Text = password_value;, может, он просто указатель сохраняет... Убедитесь в работоспособности того, что предложил я, здесь: http://ideone.com/cIxOpF – Harry Oct 15 '16 at 18:07