Problème avec une fonction mélanger mot

Signaler
Messages postés
1
Date d'inscription
dimanche 20 février 2011
Statut
Membre
Dernière intervention
20 février 2011
-
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011
-
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

2 réponses

Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

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,
Messages postés
252
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
25 avril 2011

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,