Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1544 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Concatener un même mot

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Concatener un même mot

n°1067693
d'jo
Posté le 01-05-2005 à 15:53:15  profilanswer
 

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. }

mood
Publicité
Posté le 01-05-2005 à 15:53:15  profilanswer
 

n°1067698
skelter
Posté le 01-05-2005 à 15:57:52  profilanswer
 

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

n°1067700
d'jo
Posté le 01-05-2005 à 15:59:37  profilanswer
 

j'ai essayé aussi ca marchais pas non plus

n°1067701
skelter
Posté le 01-05-2005 à 16:01:18  profilanswer
 

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

n°1067703
d'jo
Posté le 01-05-2005 à 16:03:37  profilanswer
 

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 ??

n°1067710
skelter
Posté le 01-05-2005 à 16:08:27  profilanswer
 

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
n°1067720
d'jo
Posté le 01-05-2005 à 16:10:41  profilanswer
 

ok merci

n°1067729
d'jo
Posté le 01-05-2005 à 16:20:49  profilanswer
 

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
n°1067732
d'jo
Posté le 01-05-2005 à 16:26:57  profilanswer
 

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

n°1067733
skelter
Posté le 01-05-2005 à 16:31:39  profilanswer
 

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.

mood
Publicité
Posté le 01-05-2005 à 16:31:39  profilanswer
 

n°1067734
skelter
Posté le 01-05-2005 à 16:32:34  profilanswer
 

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

n°1067738
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-05-2005 à 16:41:49  profilanswer
 

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/
n°1067739
d'jo
Posté le 01-05-2005 à 16:45:23  profilanswer
 

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é ??

n°1067740
d'jo
Posté le 01-05-2005 à 16:46:46  profilanswer
 

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

n°1067742
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-05-2005 à 16:47:55  profilanswer
 

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/
n°1067745
skelter
Posté le 01-05-2005 à 16:56:05  profilanswer
 

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 ?

n°1067757
d'jo
Posté le 01-05-2005 à 17:14:41  profilanswer
 

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

n°1067758
d'jo
Posté le 01-05-2005 à 17:15:34  profilanswer
 

skelter a écrit :


je ne comprends pas, que font ces fonctions exactement ?


 Si tu veux mon programme je peux te l'envoyer

n°1067766
skelter
Posté le 01-05-2005 à 17:26:27  profilanswer
 

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

n°1067781
d'jo
Posté le 01-05-2005 à 18:07:19  profilanswer
 

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. }

n°1067783
Taz
bisounours-codeur
Posté le 01-05-2005 à 18:13:49  profilanswer
 

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

n°1067794
d'jo
Posté le 01-05-2005 à 18:28:00  profilanswer
 

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 ?

n°1067799
skelter
Posté le 01-05-2005 à 18:30:36  profilanswer
 

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'
 

n°1067804
d'jo
Posté le 01-05-2005 à 18:35:35  profilanswer
 

oui c'est vrai

n°1067915
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-05-2005 à 19:57:35  profilanswer
 

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/
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Concatener un même mot

 

Sujets relatifs
[SQL]Concaténer 2 chaînes numériques avec espace reservéconcatener chaine + entier
[Résolu ] - VBS - Comment concaténercomment concaténer 2 entiers
Concatener diff valeurs[VBA] concaténer des tableaux
Concaténer un char à la suite d'une stringConcatener un $_POST et une variable [RESOLU]
Concaténer des entiers en Cscript shell pour concatener un ensemble de fichier.
Plus de sujets relatifs à : Concatener un même mot


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR