2 votes

Comportement du pointeur de chaîne que j'essaie de comprendre

J'ai écrit une fonction replacechar qui remplace une instance d'un caractère source par un caractère de remplacement. La fonction fonctionne dans la mesure où la chaîne de caractères est modifiée comme prévu, mais lorsque j'essaie d'utiliser la valeur de retour de la fonction, puts ne produit qu'une ligne vide.

Quelqu'un peut-il m'expliquer ce qui se passe et ce que je dois changer dans replacechar pour réparer.

#include <stdio.h>  /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */

char* replacechar(char* s, char ch1, char ch2) {
   while (*s) {
      if (*s == ch1)
         *s = ch2;

      *s++;
   }

   return s;
}

int main()
{
   char* s = malloc(8);

   strcpy(s, "aarvark");

   puts(replacechar(s, 'a', 'z')); /* prints blank line */

   puts(s);  /* prints zzrvzrk as expected */

   free(s);

   return 0;
}

Merci pour toutes les réponses.

J'ai changé pour ceci (qui fonctionne bien maintenant).

char* replacechar(char* s, char ch1, char ch2) {
   char* p = s;
   while (*p) {
      if (*p == ch1)
         *p = ch2;

      p++;
   }

   return s;
}

5voto

Seva Alekseyev Points 31812

Il renvoie la valeur de l'élément s une fois qu'il a été incrémenté au-delà de la fin de la chaîne. Créez une variable locale dans replacechar() et l'incrémenter, puis retourner la valeur originale de s .

0voto

wabepper Points 1877

C'est parce que le while boucle dans replacechar incrémenter s jusqu'à ce qu'il soit \0 . À la fin de la fonction, vous retournez le pointeur, qui pointe vers \0 et l'impression \0 est une ligne vide. Vous devriez le gérer comme ceci :

char *replacechar(char *s, char ch1, char ch2) {
    char *start = s;
    ...
    return start;
}

0voto

Perry Horwich Points 1453

Le problème que vous rencontrez ici, avec un code par ailleurs assez joli, est celui de la portée des variables.

Utilisez un autre char* local dans replacechar, comme suit

char* replacechar(char* s, char ch1, char ch2) {
   char* tmpstr;

   tmpstr=s;
   while (*tmpstr) {
      if (*tmpstr == ch1)
         *tmpstr = ch2;

      tmpstr++;  /* Note, no "*" here as in your code.  */
   }

   return s; /* s has remained unchanged */
}

0voto

ndriamessina Points 41
#include <stdio.h>  /* puts */
#include <string.h> /* strcpy */
#include <stdlib.h> /* malloc, free */

char* replacechar(char* s, char ch1, char ch2) {
   char* t = s;
   while (*s) {
      if (*s == ch1)
         *s = ch2;

      *s++;
   }

  return t;
}

int main()
{
   char* s = malloc(8);

   strcpy(s, "aarvark");

   puts(replacechar(s, 'a', 'z')); /* prints blank line */

   puts(s);  /* prints zzrvzrk as expected */

   free(s);

   return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X