Problème avec une fonction mélanger mot

cs_lewan Messages postés 1 Date d'inscription dimanche 20 février 2011 Statut Membre Dernière intervention 20 février 2011 - 20 févr. 2011 à 10:20
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 - 21 févr. 2011 à 12:00
bonjour,

voilà j'ai écris une fonction me permettant de mélanger un mot!!
Dans un premier temps je crée un dictionnaire de mot aléatoire et dans un second temps je crée une fonction qui mélange se mot.
Je me retrouve avec un problème lors de la compilation mon mot se trouve tronqué!!
Il semble y avoir un problème dans mes boucles for où la longueur de mon mot que je souhaite calculer n'est pas mis à jour!!! auriez vous une idée???


/code#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#define N 5

char * un_mot(){

int i;
char *dico[N]= {"maison", "mitochondrie", "escherichia", "institut", "programation"}; //remplissage de notre tableau de mot


srand((unsigned int) time(NULL));
i=rand()%N; //on choisit un chiffre aléatoire compris entre o et N-1

//printf("%s \n",dico[i]); // on affiche le mot choisi aléatoirement

return dico[i];
}


char * enlever_une_lettre(char * mot){

char *motReponse;
char motinitial[strlen(mot)+1];
strcpy(motinitial,mot);

int longueur_mot,c,i,j;
char *copieChaine;

longueur_mot=strlen(motinitial);
srand((unsigned int) time(NULL));

copieChaine=malloc(sizeof(char)*(longueur_mot+1));//on crée une chaine de caractere qui aura la même taille que notre chaine initiale
motReponse=malloc(sizeof(char));


for(i=0;i<longueur_mot;i++){
c=rand()%(longueur_mot);//on cherche à obtenir un nombre aléatoire compris etre 0 et la longueur de la chaine étudiée
copieChaine[i] =motinitial[c]; //on copie le caratere de la position aléatoire dans notre chaine copie

for(j=c;j<longueur_mot;j++){
motinitial[j]=motinitial[j+1]; //le dernier caractere de notre chaine prend la place du caratere à la position "c", ainsi à chaque tour de boucle le caratere est éliminé
//motinitial[j+1]='\0';
motinitial[longueur_mot]='\0';
}

}

printf("le mot melange: %s \n", copieChaine);

printf("votre réponse:\n");
scanf("%s",motReponse);

return 0;
}

int main(){

enlever_une_lettre(un_mot());


return 0;
}/code
A voir également:

2 réponses

cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
21 févr. 2011 à 11:11
Salut,

char motinitial[strlen(mot)+1];


La taille du tableau que tu déclares doit être connue à la compilation.

Allocation dynamique ?

char * motinitial;
motinitial = malloc(sizeof (*motinitial) * (strlen(mot) + 1));


Remarque annexe : tu peux te passer d'initialiser le générateur de
nombre aléatoires (appel à srand) plusieurs fois. Une fois (par exemple
au début de main) suffit.

Bonne prog,
0
cs_Chouchou182 Messages postés 252 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 25 avril 2011 1
21 févr. 2011 à 12:00
Hello,

Il y a en effet d'autres soucis plus loin.

Un algorithme linéaire de mélange de tableau (sauf faute de frappe) :

void
melange(const char * s) {
  char * t = strdup(s);
  size_t i = 0;
  size_t r = strlen(s);
  while ( r ) {
size_t c = rand() % r;
char tmp = t[c];
t[c] = t[i];
t[i] = tmp;
++i;
--r;
  }
  printf("Original: %s\nMélange : %s\n", s, t);
  free(t);
}


Fonctionne comme suit.
Pour chaque case (i) du tableau, choisit une case (c) au hasard dans la suite et échange les contenus.

Bonne prog,
0
Rejoignez-nous