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
strstrau 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]?