Comment renvoyer une chaîne de taille variable à partir d’une fonction?

J’ai besoin d’un code de travail pour une fonction qui renverra une chaîne aléatoire de longueur aléatoire.

Ce que je veux faire serait mieux décrit par le code suivant.

char *getRandomSsortingng() { char word[random-length]; // ...instructions that will fill word with random characters. return word; } void main() { char *ssortingng = getRandomSsortingng(); printf("Random ssortingng is: %s\n", ssortingng); } 

Pour cela, il est ssortingctement interdit d’utiliser un autre include que stdio.h . Edit: Ce projet sera adapté pour être compilé pour un microcontrôleur PIC. Par conséquent, je ne peux pas utiliser malloc () ni ce type de choses. La raison pour laquelle j’utilise stdio.h ici, est pour moi de pouvoir inspecter la sortie en utilisant GCC .

Actuellement, ce code donne cette erreur.-
“Warning: la fonction retourne l’adresse de la variable locale [activée par défaut]”

Ensuite, j’ai pensé que cela pourrait fonctionner.

 char *getRandomSsortingng(char *ssortingng) { char word[random-length]; // ...instructions that will fill word with random characters. ssortingng = word; return ssortingng; } void main() { char *ssortingng = getRandomSsortingng(ssortingng); printf("Random ssortingng is: %s\n", ssortingng); } 

Mais cela n’imprime qu’un tas de personnages insensés.

Il y a trois façons courantes de le faire.

  1. Demandez à l’appelant de passer un pointeur sur (le premier élément de) un tableau dans lequel les données doivent être stockées, avec un paramètre de longueur. Si la chaîne à renvoyer est plus grande que la longueur indiquée, c’est une erreur; vous devez décider comment vous en occuper. (Vous pouvez tronquer le résultat ou renvoyer un pointeur null. Dans les deux cas, l’appelant doit être en mesure de le gérer.)

  2. Renvoie un pointeur sur un object nouvellement alloué, en donnant à l’appelant la responsabilité d’appeler free fois l’opération terminée. Retourne probablement un pointeur nul si malloc() échoue (c’est toujours une possibilité et vous devriez toujours le vérifier). Etant donné que malloc et free sont déclarés dans cela ne répond pas à vos exigences (artificielles).

  3. Renvoie un pointeur sur (le premier élément de) un tableau statique . Cela évite l’erreur de retourner un pointeur sur un object alloué localement, mais présente des inconvénients. Cela signifie que les appels ultérieurs vont brouiller le résultat d’origine et imposer une taille maximale fixe.

Aucune si c’est la solution idéale.

Il pointe vers des caractères absurdes parce que vous retournez une adresse locale. char word[random-length]; est défini localement à char *getRandomSsortingng(char *ssortingng)

Allouez dynamicment la chaîne avec malloc , remplissez chaîne et renvoyez l’adresse renvoyée par malloc . Cette adresse renvoyée est allouée à partir du tas et sera allouée jusqu’à ce que vous ne la libériez pas manuellement (ou que le programme ne se termine pas).

 char *getRandomSsortingng(void) { char *word; word = malloc (sizeof (random_length)); // ...instructions that will fill word with random characters. return word; } 

Une fois que vous avez terminé avec la chaîne allouée, pensez à la libérer.

Sinon, vous pouvez également utiliser malloc pour définir static la chaîne locale dans la chaîne getRandomSsortingng , ce qui rend la durée de vie du tableau déclaré de manière statique tant que le programme est exécuté.

 char *getRandomSsortingng(void) { static char word[LENGTH]; // ...instructions that will fill word with random characters. return word; } 

Ou faites simplement le char word[128]; global.

Si j’ai bien compris, le malloc n’est pas une option.

Ecrivez quelques fonctions pour a) obtenir un entier aléatoire (longueur de chaîne) et b) un caractère aléatoire.

Ensuite, utilisez ceux-ci pour construire votre chaîne aléatoire.

Par exemple:

 //pseudocode static char random_ssortingng[MAX_STRING_LEN]; char *getRandomSsortingng() { unsigned int r = random_number(); for (i=0;i 

Si vous n’êtes pas autorisé à utiliser malloc vous devrez déclarer un tableau pouvant avoir la taille maximale possible à la scope du fichier et le remplir de caractères aléatoires.

 #define MAX_RANDOM_STRING_LENGTH 1024 char RandomSsortingngArray[MAX_RANDOM_STRING_LENGTH]; char *getRandomSsortingng(size_t length) { if( length > ( MAX_RANDOM_STRING_LENGTH - 1 ) ) { return NULL; //or handle this condition some other way } else { // fill 'length' bytes in RandomSsortingngArray with random characters. RandomSsortingngArray[length] = '\0'; return &RandomSsortingngArray[0]; } } int main() { char *ssortingng = getRandomSsortingng(100); printf("Random ssortingng is: %s\n", ssortingng); return 0; } 

Vos deux exemples renvoient des pointeurs sur des variables locales – c’est généralement un non-non. Vous ne pourrez pas créer de mémoire que votre appelant pourra utiliser sans malloc() , qui n’est pas défini dans stdio.h ; votre seule option est donc de rendre le word statique ou global, à moins que vous ne puissiez le déclarer dans main() et passez le pointeur sur votre fonction de chaîne aléatoire à renseigner. Comment générez-vous des nombres aléatoires avec les seules fonctions de stdio.h ?