Soucis de pointeur ('fin je pense)

Soucis de pointeur ('fin je pense) - C - Programmation

Marsh Posté le 19-10-2004 à 19:56:50    

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Ð(

Reply

Marsh Posté le 19-10-2004 à 19:56:50   

Reply

Marsh Posté le 19-10-2004 à 20:12:53    

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

Reply

Marsh Posté le 19-10-2004 à 20:34:29    

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
Reply

Marsh Posté le 19-10-2004 à 20:37:40    

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
Reply

Marsh Posté le 19-10-2004 à 20:43:37    

# 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

Reply

Marsh Posté le 19-10-2004 à 22:32:14    

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 ?

Reply

Marsh Posté le 19-10-2004 à 22:38:20    

ça le vide __à_l'écran__

Reply

Marsh Posté le 19-10-2004 à 22:52:25    

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

Reply

Marsh Posté le 19-10-2004 à 23:12:15    

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


 

Reply

Marsh Posté le 19-10-2004 à 23:21:12    

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

Reply

Marsh Posté le 19-10-2004 à 23:21:12   

Reply

Marsh Posté le 19-10-2004 à 23:25:53    

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

Reply

Marsh Posté le 19-10-2004 à 23:26:39    

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

Reply

Marsh Posté le 19-10-2004 à 23:28:55    

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

Reply

Marsh Posté le 19-10-2004 à 23:30:27    

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

Reply

Marsh Posté le 19-10-2004 à 23:32:10    

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';

Reply

Marsh Posté le 19-10-2004 à 23:34:24    

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

Reply

Marsh Posté le 19-10-2004 à 23:40:19    

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

Reply

Marsh Posté le 19-10-2004 à 23:44:14    

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
Reply

Marsh Posté le 19-10-2004 à 23:44:38    

edit : dsl


Message édité par cris56 le 19-10-2004 à 23:45:22
Reply

Marsh Posté le 20-10-2004 à 13:09:36    

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

Reply

Marsh Posté le 20-10-2004 à 13:12:20    

gros boulet

Reply

Marsh Posté le 20-10-2004 à 13:14:24    

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

Reply

Marsh Posté le 20-10-2004 à 13:17:10    

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

Reply

Marsh Posté le 20-10-2004 à 13:21:35    

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

Reply

Marsh Posté le 20-10-2004 à 13:22:27    

on a confirmation, t'es stupide

Reply

Marsh Posté le 20-10-2004 à 13:23:01    

[:buvons]

Reply

Marsh Posté le 20-10-2004 à 13:26:18    

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

Reply

Marsh Posté le 20-10-2004 à 13:27:11    

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

Reply

Marsh Posté le 20-10-2004 à 13:28:53    

ouéééééééé ok

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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