Comment décompresser un tableau de char en c

J’ai besoin de créer une fonction:

char * decompress(const char * src) { } 

l’entrée de cette fonction est une chaîne:

 Hello world! -> Hello world! Hel2o world!10" -> Hello world!!!!!!!!!! 

comme vous pouvez le voir s’il y a un nombre, il répète le caractère précédent ce nombre de fois. Je suis programmeur Java mais maintenant je dois résoudre ce problème en c;

J’ai maintenant ceci. Il suffit d’imprimer j’espère juste valeur mais je ne sais pas comment l’assigner pour renvoyer le pointeur

 #include  #include  #include  #include  #include  char * decompress(const char * src) { int max = 0; int pom = 1; char *vysledek = ""; int i; for (i = 0; i < strlen(src); i++) { max = 0; pom = 1; while (isdigit(src[i])) { int digit = (src[i] - '0'); max = max * 10 + digit; i++; pom++; } if (max == 0) { max = 1; } int j; for (j = 0; j < max; j++) { printf("%c", src[i - pom]); } } return vysledek; } int main(int argc, char * argv []) { decompress("Hel2o world!10"); return 0; } 

Puisque vous avez mentionné que vous êtes un programmeur Java, vous devriez vous renseigner sur le fonctionnement de l’affectation de mémoire C (dans ce cas, en particulier de chaînes):

 char *vysledek = ""; 

En Java, cela créerait un object chaîne, dans lequel vous pourrez simplement append des caractères à votre guise. En C, cependant, cela créera essentiellement un tableau de char[1] , contenant '\0' (caractère de fin de chaîne).

Comme – comme les tableaux de Java – vous ne pouvez pas (ne devriez pas) écrire en dehors des limites d’un tableau, vous pouvez stocker un caractère dans ce tableau, ce qui ne constitue pas une mémoire suffisante pour votre fonction.

Vous pouvez connaître la quantité de mémoire que vous devrez allouer en effectuant une itération sur l’entrée en premier (comme Nit l’a mentionné dans son commentaire). Ensuite, vous pouvez malloc la mémoire nécessaire pour votre pointeur de sortie:

 vysledek = malloc (); 

Maintenant que vous avez alloué suffisamment de mémoire, vous pouvez écrire votre sortie dans ce tableau. Ainsi, au lieu de

 printf("%c", src[i - pom]); 

vous pouvez maintenant écrire:

 vysledek[vysledek_counter++] = src[i - pom]; 

et retournez le pointeur.

Veuillez noter que vous devriez libérer la valeur renvoyée une fois que vous avez fini de l’utiliser, même si c’est à la fin de votre méthode principale, ce qui devrait ressembler à ceci:

 int main(int argc, char * argv []) { char *output; output = decompress("Hel2o world!10"); printf("%s\n", output); free(output); return 0; } 

Remarque supplémentaire à append: votre code échouera s’il rencontre une chaîne non terminée (c’est-à-dire qu’il n’y a pas de caractère '\0' pour indiquer la fin de la chaîne). Pour contrer cela, transmettez un paramètre de longueur de chaîne supplémentaire (vous devez définir vous-même le caractère '\0' dans le tableau de caractères renvoyé et réserver un octet de mémoire supplémentaire pour ce pointeur). Il a également un comportement indéfini (comme Cool Guy l’a souligné) lors de sa première itération, pom étant toujours égal à 1, ce qui entraîne i - pom et tente donc d’accéder à src[-1] .