Concatener un même mot

Concatener un même mot - C - Programmation

Marsh Posté le 01-05-2005 à 15:53:15    

Voila j'essai de concatener un meme mot avec une condition , tout ce passe bien même à la compilation mais la... c'est le drame il poursuit le programme sans concatener ???
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 80
  4. int main()
  5. {
  6.     int i;
  7.     char password[N],text[N];
  8. printf("entrez le mot de passe de codage (à mémoriser !):  " );
  9. fgets (password, sizeof password, stdin);
  10. printf("\nentrez le texte à coder : " );
  11. fgets (text, sizeof text, stdin);
  12. while(sizeof (password)< sizeof (text) ) { strcat(password,password);}
  13. for (i=0 ; i<strlen(password) ; i++){printf("%c",password[i]);} 
  14. return 0;
  15. }

Reply

Marsh Posté le 01-05-2005 à 15:53:15   

Reply

Marsh Posté le 01-05-2005 à 15:57:52    

sizeof (password)< sizeof (text) -> c'est une expression constante (qui est toujours fausse), strlen te donne la taille d'une chaine

Reply

Marsh Posté le 01-05-2005 à 15:59:37    

j'ai essayé aussi ca marchais pas non plus

Reply

Marsh Posté le 01-05-2005 à 16:01:18    

strcat(password,password); ne peu pas marcher
 
tu veux faire quoi avec cette boucle ??
while(sizeof (password)< sizeof (text) ) { strcat(password,password);}

Reply

Marsh Posté le 01-05-2005 à 16:03:37    

en fait je code un text a l aide d'un mot de pass et il me faut un mot de pass au moins aussi long que le text donc je le concatene jusqu'a la bonne dimension . Je ne comprend pas pk ca peut pas marcher ??

Reply

Marsh Posté le 01-05-2005 à 16:08:27    

tu n'a pas besoin de concatenation dans ce cas, suffit de cylcer sur le password tant que tu n'est pas a la fin du texte, reflechie bien a l'algo
 
strcat(password,password); ne peu pas marcher car tu lui passe la meme chaine, strcat va d'abord rechercher la fin de la chaine, puis commencer a copier l'autre jusqu'a la fin de celle-ci mais comme c'est la meme la fin (caracter '\0') aura deja ete ecrase


Message édité par skelter le 01-05-2005 à 16:08:52
Reply

Marsh Posté le 01-05-2005 à 16:10:41    

ok merci

Reply

Marsh Posté le 01-05-2005 à 16:20:49    

comme j'ai effectué un fgets il faut reperer le '\o' et donner une condition qui prend alors le caractere^password[i-strlen(password)*strlen(password)/i-1]. Je pense que ça devrait fonctionner


Message édité par d'jo le 01-05-2005 à 16:26:14
Reply

Marsh Posté le 01-05-2005 à 16:26:57    

hé bien non !! tu es sur que le fgets renvoit un /0 en fin de chaine ?

Reply

Marsh Posté le 01-05-2005 à 16:31:39    

et bien verifions
 
man fgets

Citation :

The fgets() function reads at most one less than the number of characters
specified by size from the given stream and stores them in the string
str.  Reading stops when a newline character is found, at end-of-file or
error.  The newline, if any, is retained.  If any characters are read and
there is no error, a `\0' character is appended to end the string.

Reply

Marsh Posté le 01-05-2005 à 16:31:39   

Reply

Marsh Posté le 01-05-2005 à 16:32:34    

tu veux faire quoi concretement ? (en francais, pas en algo :) )

Reply

Marsh Posté le 01-05-2005 à 16:41:49    

d'jo a écrit :

hé bien non !! tu es sur que le fgets renvoit un /0 en fin de chaine ?


Non. Il place un '\0' (ou 0) en fin de chaine. Par contre, si il y a la place, il met aussi, avant le 0, le '\n' que tu as saisi en faisant <enter>. Je serais toi, je commencerais par faire le ménage, comme je te l'ai déjà indiqué... Je fatigue de voir que tu mets encore des strlen() dans les boucles... Je me demande parfois pourquoi j'essaye d'expliquer les choses si tu n'en tiens pas compte...


Message édité par Emmanuel Delahaye le 01-05-2005 à 16:44:36

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-05-2005 à 16:45:23    

skelter a écrit :

tu veux faire quoi concretement ? (en francais, pas en algo :) )


 
je veux coder un text à l'aide d'un mot de passe , chaque lettre du mot de passe fait correspondre une autre lettre pour le texte => il sort un texte codé . comme le texte est plus long que le mot de passe alors je doit "contanener"le mot de passe afin de faire correspondre a chaque lettre du text una autre lettre .
J'ai reussi avec la méthode que tu m'a conseillé  

Code :
  1. for (i=0 ;i<strlen(text)-1 ; i++)
  2.   {
  3.    if (text[i]==' '){code[i]=' ';}
  4.    else code[i]=codage1(equiv(password[i-1-(strlen(password)-1)*(int)(strlen(password)-1)/i]),equiv(text[i]));
  5.    
  6.   }


Mais il me dit que l'interieur de passwor [] est floatant alors que j'ai forcé ??

Reply

Marsh Posté le 01-05-2005 à 16:46:46    

equiv() me permet de convertir en chiffre et avec 2 chiffre codage1() donne la lettre correspondante

Reply

Marsh Posté le 01-05-2005 à 16:47:55    

d'jo a écrit :

en fait je code un text a l aide d'un mot de pass et il me faut un mot de pass au moins aussi long que le text donc je le concatene jusqu'a la bonne dimension . Je ne comprend pas pk ca peut pas marcher ??


Alors il faut mémoriser la saisie initiale, et 'ajouter' celle-ci à la chaine. Tu ne peux pas faire strcat() sur une chaine en ayant source et destination identiques.
 
Revoir l'algo.
 
 Il suffit de fabriquer un 'générateur' de caractères à partir de la clé que tu as saisie (et nettoyée, bien sûr).
 
Par exemple :  


int get_car_cle (char const *cle, int *pi)
{
   int c = -1;
   if (cle != NULL && pi != NULL)
   {
      int i = *pi;
 
      c = cle[i];
      i++;
 
      if (cle[i] == 0)
      {
         i = 0;
      }
      *pi = i;
   }
   return c;
}


Tu appelles ça dans ta boucle d'encodage ou de décodage et ça roule... (avec i = 0 la première fois)


Message édité par Emmanuel Delahaye le 01-05-2005 à 17:17:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 01-05-2005 à 16:56:05    

voir aussi l'operateur % (modulo)
 
en principe password[ i % password_size ] suffit pour indexer cycliquement password
 

Citation :

equiv() me permet de convertir en chiffre et avec 2 chiffre codage1() donne la lettre correspondante


 
je ne comprends pas, que font ces fonctions exactement ?

Reply

Marsh Posté le 01-05-2005 à 17:14:41    

Impeccable le modulo !!c'est bon ca rool.
Merci aussi emmanuel .

Reply

Marsh Posté le 01-05-2005 à 17:15:34    

skelter a écrit :


je ne comprends pas, que font ces fonctions exactement ?


 Si tu veux mon programme je peux te l'envoyer

Reply

Marsh Posté le 01-05-2005 à 17:26:27    

pose plutot le source de ces fonctions ici, si c'est pas trop lourd

Reply

Marsh Posté le 01-05-2005 à 18:07:19    

skelter a écrit :

pose plutot le source de ces fonctions ici, si c'est pas trop lourd


 

Code :
  1. static char const alphab[] = "abcdefghijklmnopqrstuvwxyz";
  2. char codage1(int a,int b)
  3. {
  4. int i,j;                           
  5. char M[26][26];
  6.   for (i=0 ; i <26 ;i++)
  7.    {
  8.       for (j=0 ; j <26 ;j++)
  9.        {
  10.          if (i+j<26) M[i][j]=alphab[i+j] ;
  11.          else M[i][j]=alphab[(i+j)-26] ;   
  12.        }   
  13.    }           
  14. return M[a][b];   
  15. }
  16. int equiv(char lettre)
  17. {
  18. int i=0;
  19.   while (alphab[i]!=lettre ){ i++; }
  20. return i;   
  21. }

Reply

Marsh Posté le 01-05-2005 à 18:13:49    

# printf("entrez le mot de passe de codage (à mémoriser !):  " );
-> fflush(stdout);
# fgets (password, sizeof password, stdin);

Reply

Marsh Posté le 01-05-2005 à 18:28:00    

merci mais pourquoi vous me dites tous ca ?? je connait pas ca sert à koi ? Mon prog marche bien pour l'instant ca apporte koi exactement ?

Reply

Marsh Posté le 01-05-2005 à 18:30:36    

d'jo a écrit :

Code :
  1. static char const alphab[] = "abcdefghijklmnopqrstuvwxyz";
  2. char codage1(int a,int b)
  3. {
  4. int i,j;                           
  5. char M[26][26];
  6.   for (i=0 ; i <26 ;i++)
  7.    {
  8.       for (j=0 ; j <26 ;j++)
  9.        {
  10.          if (i+j<26) M[i][j]=alphab[i+j] ;
  11.          else M[i][j]=alphab[(i+j)-26] ;   
  12.        }   
  13.    }           
  14. return M[a];   
  15. }
  16. int equiv(char lettre)
  17. {
  18. int i=0;
  19.   while (alphab[i]!=lettre ){ i++; }
  20. return i;   
  21. }



 
 
la table alphab n'est pas necessaire, independament du jeu de caractere on a toujours 'a' < 'b' < ... < 'z'
[b]alphab[(i+j)-26] est equivalent a 'a' + (i+j)-26
 
de meme le traitement fait dans la fonction equiv est inutile
equiv(lettre) == lettre - 'a'
 

Reply

Marsh Posté le 01-05-2005 à 18:35:35    

oui c'est vrai

Reply

Marsh Posté le 01-05-2005 à 19:57:35    

d'jo a écrit :

merci mais pourquoi vous me dites tous ca ?? je connait pas ca sert à koi ? Mon prog marche bien pour l'instant ca apporte koi exactement ?


Je t'ai déjà donné ce lien...
Fatiguant... Lit les réponses, sinon, on a l'impression de parler dans le vide...
 
http://mapage.noos.fr/emdel/notes.htm#fflush_stdout


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed