-1
votes

Comment itérer sur un tableau de pointeur de caractère renvoyé par une fonction dans le CPP

Je crée une fonction qui crée un groupe 28 de caractères aléatoires d'A-Z. Lorsque j'essaie d'ithéter sur le tableau de pointeur de principal code>, je reçois les mauvaises valeurs.

Que je me manque? > P>

Je sais Les matrices sont transmises par référence à la fonction, sont renvoyées par référence aussi? P>

#include <iostream>
#include <ctime>
#define MAX 28

// Generate random char array with a-z values
char* generateRandomString(int length) {
    char random[length];
    for (int i = 0; i < length; i++) {
        // Minimun a ascii = 97
        // Maximun z ascii = 122
        srand(int(time(NULL))); // Timestamp seed generator
        int randomInt = 97 + (rand() % 25);
        char randomChar = randomInt;
        random[i] = randomChar;
    }
    return random;
}

int main() {
    char* random = generateRandomString(MAX);

    for (int i = 0; i < MAX; i++) {
        std::cout << random[i] << std::endl; // (*random)[i] Does not work neither
    }

    return 0;
}


3 commentaires

Vous ne pouvez pas déclarer un tableau local et renvoyer son adresse comme celle-là. La mémoire devient invalide lorsque la fonction dépasse la portée. Vous avez (au moins) deux choix: 1) "Nouveau" Le tableau, ou 2) allouer le tampon à l'extérieur de la fonction et transmettez-le sous forme de paramètre.


Note latérale: Les tableaux de longueur variable ne sont pas valides C ++. Renvoie une STD: String à la place.


Votre code renvoie un pointeur par valeur.


3 Réponses :


5
votes

Vous retournez un pointeur sur une variable locale qui dépasse la portée avant que l'appelant puisse l'utiliser. Il suffit d'utiliser std :: string code> à la place.

et n'appelle pas srand () code> plusieurs fois, appelez cela une seule fois. 1 sup>

1: encore meilleur, n'utilisez pas srand () code> du tout, utilisez un générateur de nombres aléatoires C ++ à partir du code> bibliothèque à la place. sup> p>

#include <iostream>
#include <string>
#include <ctime>
#define MAX 28

// Generate random char array with a-z values
std::string generateRandomString(int length) {
    std::string random;
    random.resize(length);
    for (int i = 0; i < length; i++) {
        // Minimun a ascii = 97
        // Maximun z ascii = 122
        int randomInt = 97 + (rand() % 25);
        char randomChar = randomInt;
        random[i] = randomChar;
    }
    return random;
}

int main() {
    srand(int(time(NULL))); // Timestamp seed generator

    std::string random = generateRandomString(MAX);

    for (int i = 0; i < MAX; i++) {
        std::cout << random[i] << std::endl; // (*random)[i] Does not work neither
    }

    return 0;
}


1 commentaires

Merci, je suis nouveau au CPP donc j'apprécie vraiment vos suggestions !!



1
votes
std::string random = generateRandomString(MAX);
...

1 commentaires

Popping ma tête ici pour signaler que le + 1 dans char * aléatoire = nouveau char [longueur + 1]; et le aléatoire [longueur] = 0 ; // est totalement importante si vous allez utiliser char pour tenir des chaînes.



0
votes

La fonction generaterateromstring code> renvoie le pointeur sur le premier élément d'un tableau local.

#include <iostream>
#include <cstdlib>
#include<ctime>

char * generateRandomString( size_t length ) 
{
    char *s = new char[length + 1];

    s[length] = '\0';

    std::srand( ( unsigned int )std::time( nullptr ) );

    for ( size_t i = 0; i < length; i++  )
    {
        s[i] = 'a' + std::rand() % ( 'z' - 'a' + 1 );
    }

    return s;
}

int main() 
{
    const size_t MAX = 28;

    char *s = generateRandomString( MAX );

    std::cout << s << '\n';

    delete [] s;
}


0 commentaires