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

  FORUM HardWare.fr
  Programmation
  C

  Soucis de pointeur ('fin je pense)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Soucis de pointeur ('fin je pense)

n°877335
JFK99
Posté le 19-10-2004 à 19:56:50  profilanswer
 

Bonsoir à tous,  
 
je vous explique mon probleme, j'essais de faire un programme qui inverse une chaine de caractere mais lorsque je copie les valeur de mon tableau de chaine dans un autre tableau de chaine et que j'affiche le  
tableau inversé, je n'obtient pas du tout la meme chose. Je pense que ca doit venir d'une histoire de pointeur mais je ne suis pas sur et je ne sais pas comment y remedier.
Merci d'avance de votre aide.
Nico
 
Voici le code :

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. main(){
  4. char chaine[100]; //tableau original
  5. char chaine_inverse[100]; //tableau qui va recevoir les elements inversés
  6. int i = 0; //variable d'incrémentation
  7. int y; //Variable de décrémentation
  8. printf("Entrez la chaine : " );
  9. scanf("%s", chaine); //Saisie de la chaine
  10. y = strlen(chaine); //Taille de la chaine
  11. while(i < y) //Boucle qui va jusqu'a taille de la chaine "chaine"
  12.  {
  13.   chaine_inverse[y] = chaine[i]; //Affectation
  14.   y--; //Décrementation
  15.   i++; //incrémentation
  16.  }
  17. printf("%s", chaine_inverse); //Affichage de la chaine inversé
  18. printf("\n" );
  19. }


 
Résultat :
> ./pal
Entrez la chaine : nico
Üë¿inÐ(

mood
Publicité
Posté le 19-10-2004 à 19:56:50  profilanswer
 

n°877360
cris56
Posté le 19-10-2004 à 20:12:53  profilanswer
 

fgets pour saisir une chaine, scanf et gets à eviter
 
et chaine[ strlen(chaine) ] == '\0';

n°877383
JFK99
Posté le 19-10-2004 à 20:34:29  profilanswer
 

merci du conseil mais entre temps j'ai trouvé d'ou venait mon probleme : condition de sortie fausse et je me suis planté dans l'indice des tableau de chaine.
 
merci quand meme.
 
nico


Message édité par JFK99 le 19-10-2004 à 20:34:43
n°877385
cris56
Posté le 19-10-2004 à 20:37:40  profilanswer
 

oui, mais il me semble que c'est ce que je disais en te montrant que
 
chaine[ strlen(chaine) ] == '\0'; pour ton indice y tu aurais du prendre strlen(chaine) - 1
 
:)
 
edit : pense à utiliser size_t pour les indices


Message édité par cris56 le 19-10-2004 à 20:38:15
n°877388
Taz
bisounours-codeur
Posté le 19-10-2004 à 20:43:37  profilanswer
 

# printf("Entrez la chaine : " );  
#     scanf("%s", chaine);
 
 
j'adore -->
printf("plop" ); fflush(stdout);
fgets(chaine, sizeof chaine, stdin);
 
 
# printf("%s", chaine_inverse); //Affichage de la chaine inversé
#     printf("\n" );
 
faudrait voir à économiser les printf
 
 
sinon niveau algo, réfléchi un peu, tu peux retourner ta chaine sur place

n°877531
JFK99
Posté le 19-10-2004 à 22:32:14  profilanswer
 

ok je note tout ca, je vais surement rappliquer dans la soirée car en fait la finalité du prog c'est de vérifier que la chaine entrée est un palindrome. il doit avoir deja plein de source la dessus mais j'essai de la faire seul.
 
Sinon fflush(stdout) ca vide le buffer ?

n°877543
Taz
bisounours-codeur
Posté le 19-10-2004 à 22:38:20  profilanswer
 

ça le vide __à_l'écran__

n°877571
JFK99
Posté le 19-10-2004 à 22:52:25  profilanswer
 

Bon ca fonctionne bisarement :
> ./pal
Entrez la chaine : nico
ocin
> ./pal
Entrez la chaine : nicolas
salocin(
> ./pal
Entrez la chaine : nic
cin¿
 
Comment se fait t'il que ca fonctionne pour certain mot et pas d'autre, au début je pensais que ct un probleme de parité, mais enfait non...
vous en pensez quoi ?
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. main(){
  4. char chaine[100]; //tableau original
  5. char chaine_inverse[100]; //tableau qui va recevoir les elements inversés
  6. int i = 0; //variable d'incrémentation
  7. int y; //Variable de décrémentation
  8. printf("Entrez la chaine : " );
  9. scanf("%s", chaine); //Saisie de la chaine
  10. y = strlen(chaine) - 1; //Taille de la chaine
  11. while( i < strlen(chaine) ) //Boucle qui va jusqu'a taille de la chaine "chaine"
  12.  {
  13.   chaine_inverse[y] = chaine[i]; //Affectation
  14.   y--; //Décrementation
  15.   i++; //incrémentation
  16.  }
  17. printf("%s \n", chaine_inverse); //Affichage de la chaine inversé
  18. }

n°877591
cris56
Posté le 19-10-2004 à 23:12:15  profilanswer
 

en fait si tu n'avais pas besoins de copier la chaine, tu pourrais faire qu'un demi parcour
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.     size_t i, m, len, cur;
  6.     char string[100];
  7.     char reverse_string[100];
  8.     char c;
  9.    
  10.     printf( "pliz enter the chaine : " );
  11.     fflush( stdout ); 
  12.    
  13.     fgets( string, sizeof string, stdin );
  14.     len = strlen( string );
  15.    
  16.     /*
  17.     m = len / 2;
  18.      
  19.     strcpy( reverse_string, string );
  20.      
  21.     for( i = 0; i < m; i++ )
  22.     {
  23.         cur = len - (i+1);
  24.          
  25.         c = reverse_string[i];  
  26.         reverse_string[i] = reverse_string[ cur ];
  27.         reverse_string[ cur ] = c;
  28.     }
  29.     */
  30.    
  31.     for( i = 0; i < len; i++ )
  32.     {
  33.         reverse_string[i] = string[ len - (i+1) ];
  34.     }
  35.    
  36.     puts( reverse_string );
  37.        
  38.     return 0;
  39. }


 

n°877616
fafounet
Posté le 19-10-2004 à 23:21:12  profilanswer
 

Ton code marche presque. Il y a une petite erreur pour les mots ayant un nombre pair de lettres
 
/a.out
pliz enter the chaine : abcde
 
edcba
 
 
./a.out
pliz enter the chaine : abcd
 
dcbax

mood
Publicité
Posté le 19-10-2004 à 23:21:12  profilanswer
 

n°877630
JFK99
Posté le 19-10-2004 à 23:25:53  profilanswer
 

meme avec ton code cris56 j'obtient des erreurs bizarres.
pliz enter the chaine : nic
 
cin¨h(Øë¿¿

n°877633
fafounet
Posté le 19-10-2004 à 23:26:39  profilanswer
 

Oups j'ai rien dit perso car j'avais pas vu qu'il fallait décommenter

n°877641
JFK99
Posté le 19-10-2004 à 23:28:55  profilanswer
 

ouép moi aussi désolé, g oublié de recompilé lol :p

n°877645
Taz
bisounours-codeur
Posté le 19-10-2004 à 23:30:27  profilanswer
 

le truc c'est qu'aucun de vous deux n'a lu nos recommandations. Et après plusieurs exemples vous voyez toujours pas : y a pas de putain d'\0' à la fin de votre reversed_string

n°877648
cris56
Posté le 19-10-2004 à 23:32:10  profilanswer
 

oui, dans le deuxieme cas j'ai oublié le caractere null :(
 
char reverse_string[100] = "";
 
ou
 
for( i = 0; i < len; i++ )  
{  
        reverse_string[i] = string[ len - (i + 1) ];  
}  
reverse_string[i] = '\0';

n°877651
JFK99
Posté le 19-10-2004 à 23:34:24  profilanswer
 

laisse tomber, je n'aurais jamais trouvé si vous me l'aviez pas dit explicitement.

n°877655
Taz
bisounours-codeur
Posté le 19-10-2004 à 23:40:19  profilanswer
 

quand je disais transformation sur place, je pensais pas copier-transformer_sur_place :p

n°877657
cris56
Posté le 19-10-2004 à 23:44:14  profilanswer
 

c'etait pour qu'en décommentant ca marche direct, mais c'etais sous entendu qu'une seule chaine etait necessaire dans ce cas
 
j'ai mis l'autres car dans ce cas fait c'etais la solution la plus aproprié je pense, copier string danss reverse_string dans l'ordre inverse


Message édité par cris56 le 19-10-2004 à 23:45:00
n°877658
cris56
Posté le 19-10-2004 à 23:44:38  profilanswer
 

edit : dsl


Message édité par cris56 le 19-10-2004 à 23:45:22
n°877873
JFK99
Posté le 20-10-2004 à 13:09:36  profilanswer
 

Bonjour à tous,
J'ai finis le palindrome mais je voudrais à présent faire une fonction palindrome, j'ai essayer de la faire, mais j'obtient une erreur de compilation et je ne sais que faire, ca doit probablement venir du passage de variable...
 
> gcc pal2.c -o pal2
pal2.c: In function `palindrome':
pal2.c:29: warning: declaration of `string' shadows a parameter
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4.      int i;
  5.  int palindrome(char string[100]);
  6.  char str[100];
  7.  printf( "pliz enter the chaine : " );
  8.      fflush( stdout ); 
  9.      fgets( str, sizeof str, stdin );
  10.  i = palindrome(str);
  11. if (i==1)
  12. {
  13.  printf("C'est un palindrome \n" );
  14. }
  15. else
  16. {
  17.  printf("Ce n'est pas un palindrome \n" );
  18. }
  19.      return 0;
  20. int palindrome(char string[100])
  21. {
  22.  size_t i,y, m, len, cur; 
  23.  char string[100]; 
  24.  char string_nospace[100];
  25.      char reverse_string[100]; 
  26.      char c;
  27.  len = strlen( string );
  28.      m = len / 2;
  29.      i = 0;
  30.  y = 0;
  31.      for(i = 0; i< strlen(string) - 1; i++)
  32.   {
  33.  if (string[i] !=' ')
  34.  {
  35.   string_nospace[y]=string[i];
  36.   y++;
  37.  }
  38.  }
  39.  string_nospace[y]='\0';
  40. //  printf("%s", string_nospace);
  41.      strcpy(reverse_string, string_nospace);
  42.      len = strlen( string_nospace );
  43.      m = len / 2;
  44.      for( i = 0; i < m; i++ )
  45.      {
  46.          cur = len - (i+1);         
  47.          c = reverse_string[i]; 
  48.          reverse_string[i] = reverse_string[ cur ];
  49.          reverse_string[ cur ] = c;
  50.  }
  51.      //printf("%s \n", reverse_string);
  52.  //printf("%s \n", string_nospace);
  53.     y = 0;
  54. for(i = 0; i< strlen(string_nospace); i++)
  55.  {
  56.  y++;
  57.  if (string_nospace[i] != reverse_string[i])
  58.  {
  59.   //printf("ce n'est pas un palindrome \n" );
  60.   //break;
  61.   return 0;
  62.  }
  63.  else if (y==strlen(reverse_string))
  64.  {
  65.   //printf("c'est un palindrome \n" );
  66.   return 1;
  67.  }
  68.  //printf(" %c = %c \n", string_nospace[i], reverse_string[i]);  
  69.  }
  70. }

n°877874
Taz
bisounours-codeur
Posté le 20-10-2004 à 13:12:20  profilanswer
 

gros boulet

n°877875
JFK99
Posté le 20-10-2004 à 13:14:24  profilanswer
 

lol (c'est que je me suis dit quand j'ai posté le message :p)

n°877876
Taz
bisounours-codeur
Posté le 20-10-2004 à 13:17:10  profilanswer
 

déjà c'est pas une erreur
et le message est explicite. Apprend l'anglais

n°877879
JFK99
Posté le 20-10-2004 à 13:21:35  profilanswer
 

ah yes, jsuis trop bete, j'ai viré le char string[100]
bon ben ca marche c'est cool, merci taz, cris56 et fafounet :)

Code :
  1. int palindrome()
  2. {

n°877881
Taz
bisounours-codeur
Posté le 20-10-2004 à 13:22:27  profilanswer
 

on a confirmation, t'es stupide

n°877882
WhatDe
Posté le 20-10-2004 à 13:23:01  profilanswer
 

[:buvons]

n°877883
JFK99
Posté le 20-10-2004 à 13:26:18  profilanswer
 

héhé, je progresse, c'est le principal.

n°877884
WhatDe
Posté le 20-10-2004 à 13:27:11  profilanswer
 

Progresser à l'envers, on appelle ca régresser.

n°877885
JFK99
Posté le 20-10-2004 à 13:28:53  profilanswer
 

ouéééééééé ok

mood
Publicité
Posté le   profilanswer
 


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

  Soucis de pointeur ('fin je pense)

 

Sujets relatifs
Pointeur de fonction en paramètre[JAVASCRIPT][Newbie] Petit soucis de récupération de variable
[C++] Appel à une méthode récupérée par pointeurTas, pile et pointeur
Soucis avec une requete SQL[VBA Excel] Petit soucis de déclaration dans une requette
Pointeur sur un élément d'un std::vector[Access] Pas dur je pense mais jy arrive pas
petit soucis au lancement de mySQL sous linux (REDHAT 9.0)histoire de pointeur
Plus de sujets relatifs à : Soucis de pointeur ('fin je pense)


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