4
votes

Comment échanger deux caractères pour un caractère en C?

J'essaye donc de changer cc avec & dans une phrase ("Salut c'est Mark cc Alice"). Jusqu'à présent, j'ai ce code où il remplace le premier c par & mais le second c est toujours là. Comment pourrais-je me débarrasser du deuxième c?

"Hi this is Mark &c Alice"

L'entrée est:

"Hi this is Mark cc Alice"

La sortie est:

int main()
{
    char str[] = "Hi this is Mark cc Alice";
    int i=0;
    while(str[i]!='\0'){
        if(str[i]=='c' && str[i+1]=='c'){
            str[i]='&';  
            //str[i+1]=' ';
        }
        i++;
    }
    printf("\n-------------------------------------");
    printf("\nString After Replacing 'cc' by '&'");
    printf("\n-------------------------------------\n");
    printf("%s\n",str);
    return str;
}


2 commentaires

Vous devez tout déplacer après le deuxième c .


Comment le décalerais-je définir str [i + 1] = str [i + 2]?


3 Réponses :


4
votes

Vous pouvez simplement le mélanger à un endroit en utilisant une fonction générique de "retour en arrière":

for (char* s = str; *s; ++s) {
  if (s[0] == 'c' && s[1] == 'c'){
    *s = '&';

    shunt(&s[1], &s[2]);
  }
}

Où vous pouvez l'utiliser comme ceci:

int main(){
  char str[] = "Hi this is Mark cc Alice";

  for (int i = 0; str[i]; ++i) {
    if (str[i] == 'c' && str[i+1] == 'c') {
      str[i]='&';

      shunt(&str[i+1], &str[i+2]);
    }
  }

  printf("\n-------------------------------------");
  printf("\nString After Replacing 'cc' by '&'");
  printf("\n-------------------------------------\n");
  printf("%s\n",str);

  // main() should return a valid int status code (0 = success)
  return 0;
}

Notez le passage de la déclaration int désordonnée + while + incrémentée en une boucle for . Ce serait encore moins compliqué en utilisant un pointeur char* place:

void shunt(char* dest, char* src) {
  while (*dest) {
    *dest = *src;
    ++dest;
    ++src;
  }
}

Lorsque vous travaillez avec des chaînes C, il est important d'être à l'aise avec les pointeurs, car cela peut vous éviter beaucoup de tracas.

Vous devez également vous familiariser avec la bibliothèque standard C afin de pouvoir utiliser des outils tels que strstr au lieu d'écrire votre propre équivalent. Ici, strstr(str, "cc") aurait pu aider.


0 commentaires

2
votes

Bienvenue à SO! Comme quelqu'un l'a déjà souligné, vous devez déplacer l'ensemble du tableau vers la gauche. Une façon simple de le faire est:

#include <stdio.h>
#include <string.h>

#define STR_SIZE 25

int main(){
  const char str[STR_SIZE] = "Hi this is Mark cc Alice";
  int i=0,j=0;

  while(str[i]!='\0'){
    if(str[i]=='c' && str[i+1]=='c'){ 
      str[i]='&';
      for (j=i+1; j<STR_SIZE-1; j++) /* Shifting the array to the left */
      {
          str[j]=str[j+1];
      }
    }
    i++;
  }
  printf("\n-------------------------------------");
  printf("\nString After Replacing 'cc' by '&'");
  printf("\n-------------------------------------\n");
  printf("%s\n",str);
  return 0;
}


1 commentaires

Il n'y a pas besoin de STR_SIZE ici. Si quelque chose pose problème si cette chaîne s'allonge un jour.



0
votes

sans changer une grande partie de votre code, vous pouvez également le faire ci-dessous

#include <stdio.h>

int main()
{
  char str[] = "Hi this is Mark cc Alice";
  int i=0;
  while(str[i]!='\0')
  {
    if(str[i]=='c' && str[i+1]=='c')
    {
      str[i]='&'; 
      // after replacing the first 'c' increment the i, so it will point to next c.
      i++;
      break;
      //str[i+1]=' ';
    }
    i++;
  }
  // replace previous char with next char until null
  while(str[i]!='\0')
  {
      str[i] = str[i+1];
      i++;
  }
  printf("\n-------------------------------------");
  printf("\nString After Replacing 'cc' by '&'");
  printf("\n-------------------------------------\n");
  printf("%s\n",str);
  return 0;
}


1 commentaires

Aussi @RainbowUnicorn, vous retournez str à la fin de main, ce n'est pas correct, utilisez simplement return 0;