2014-01-09 3 views
1

Мое случайное построение строк генерирует случайную строку из символов a-z просто отлично, но в конце ее есть некоторые странные символы: ÌÌÌÌÌÌÌÌÌ. Кроме того, после странных символов он снова печатает a-z.Генерация случайных строк, создающих странные символы

if(m_lower.GetCheck() == 1) 
{ 
    char pwd[] = "abcdefghijklmnopqrstuvwxyz"; 
    char password[26]; 
    for(int i=0; i<26; i++) { 
    password[i] = pwd[rand()%26]; 
    } 
    OnGenerate = password; 
    UpdateData(FALSE); 
} 

Вышеприведенный код проверяет, чтобы увидеть, если флажок установлен, то он посылает произвольный текст в элементе управления редактированием. Который почти отлично работает, это просто странные персонажи и дополнительные a-z в конце. Может кто-то указать мне верное направление?

+0

Вы не указали нам код, в котором вы ничего выводили. Вид важного ... Почти наверняка это происходит из-за того, что N-завершение вашей C-строки. Почему вы не используете 'std :: string'? –

ответ

2

Вам нужно добавить нулевой ограничитель в конце строки.

password[sizeof(password) - 1] = '\0'; //note sizeof works in this case because 
             //password is an array and sizeof(char)==1 

(вам нужно изменить размер password до 27 и заполнить первые 26 символов со случайными из них)

+0

@BenjaminLindley означает писать sizeof. –

+0

спасибо, я никогда не думал о нулевом завершении строки. – user3179762

1

Поскольку это C++, а не C, вы должны воспользоваться std::string:

if(m_lower.GetCheck() == 1) 
{ 
    char pwd[] = "abcdefghijklmnopqrstuvwxyz"; 
    std::string password; 
    for(int i=0; i<26; i++) { 
     password.append(1, pwd[rand() % 26]); 
    } 
    OnGenerate = password.c_str(); 
    UpdateData(FALSE); 
} 

Таким образом, исключается необходимость явно отслеживать ограничитель строк. Поскольку переменная пароля будет выходить за пределы области в конце блока if, если OnGenerate - это char*, то в итоге вы получите висячий указатель. Использование string напрямую, гарантирует, что содержимое хранится в живых:

if(m_lower.GetCheck() == 1) 
{ 
    char pwd[] = "abcdefghijklmnopqrstuvwxyz"; 
    OnGenerate.clear(); 
    for(int i=0; i<26; i++) { 
     OnGenerate.append(1, pwd[rand() % 26]); 
    } 
    UpdateData(FALSE); 
} 

Вы должны объявить OnGenerate быть типа std::string вместо char*. Вы можете получить доступ к char*, если он был загружен с помощью OnGenerate.c_str().

+1

Все в пользу использования концепций C++, но что случилось с 'OnGenerate', когда' password' выходит за рамки? –

+0

благодарю вас за ответ, который также помогает мне. – user3179762

+0

@LuchianGrigore То же самое, что будет с «OnGenerate» var в коде OP и с вашим обновлением тоже, я думаю;) –

Смежные вопросы