Konwersja łańcucha QString do tablicy char - dlaczego tylko pierwsze 4 znaki?

0

Piszę sobie generator haseł. W okienku jest:

  • QLineEdit - zawiera listę znaków, z których będzie generowane hasło
  • QSpinBox - określa długość hasła
    Kod konwersji QString do tablicy znaków wygląda tak:
int passwordLenght = spinBox_PasswordLenght->value();
QString chars = lineEdit_Charset->text();
QByteArray array = chars.toUtf8();
const char *characters = array.data();
int charactersNumber = sizeof(characters);
QString password;

for (; passwordLenght > 0; passwordLenght--)
{
    password += characters[rand()%charactersNumber];
}
lineEdit_Password->setText(password);

Program działa, ale tylko częściowo, bo rozmiar tablicy characters to tylko 4 znaki:

int charactersNumber = sizeof(characters); // zawsze wynosi 4

Co jest w kodzie źle, że program generuje tylko pierwsze cztery znaki?

1
QString str;
const char* x = str.toStdString().c_str();

Adnotacja co do poziomu "bezpieczenstwa" kodu, znajduje sie w poscie @adif ponizej.

0

Dzięki za odpowiedź. Ale teraz losuje mi tylko jeden znak. W tablicy znaków są dalej tylko 4 znaki do wylosowania, ale losowany jest tylko jeden, a jeśli ustawię długość hasła na np. 50 albo więcej, to nie losuje żadnych znaków.

0

sizeof() na dynamicznej tablicy zwraca rozmiar wskaznika, a nie tablicy. Uzyj jakiegos strlen(), size() lub cos co faktycznie sluzy do obliczania rozmiaru lancucha.

I uzyles srand() gdzies wczesniej w kodzie?

Poza tym robisz to straszniee dziwnie. Jaki jest sens w ogole tej konwersji?

0

Masz rację, może trochę pomieszałem, początkujący jestem. Rozwiązałem to inaczej, bez konwersji, po prostu losowanie pozycji w łańcuchu znaków:

password += chars.at(rand()%chars.length());

Działa. Dzięki za zainteresowanie tematem.

1

tylko dodam ze kod @n0name_l jest troche niebezpieczny tzn chodzi o to

QString str;
const char* x = str.toStdString().c_str();
 

glownie chodzi oto ze objekt std::stringa (ten zwracany z qstringa) dosc szybko jest nieaktualny(niszczony) i ten wskaznik na c stringa moze powodowac problemy

2

dlatego nie należy trzymać tego char* jako zmiennej, a konwersji użyć tylko w wywołaniu jakiejś funkcji przyjmującej char*:

QString str;
...
jakaśFunkcja(s.toStdString().c_str());

i przede wszystkim, jeśli nie ma konieczności użycia char*, lepiej operować całkowicie na QString.

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