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; }
3 Réponses :
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.
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; }
Il n'y a pas besoin de STR_SIZE
ici. Si quelque chose pose problème si cette chaîne s'allonge un jour.
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; }
Aussi @RainbowUnicorn, vous retournez str
à la fin de main, ce n'est pas correct, utilisez simplement return 0;
Vous devez tout déplacer après le deuxième
c
.Comment le décalerais-je définir str [i + 1] = str [i + 2]?