Juste itérer le texte et les caractères échange:
int main()
{
char text[] = "...Z.Z.Z...", temp;
int text_len = strlen (text), i;
for (i = text_len - 1; i >= 0; i--)
{
if (text[i] == 'Z')
{
temp = text[i+1];
text[i+1] = text[i];
text[i] = temp;
}
}
printf ("%s\n", text);
return 0;
}
Produit:
[~]$ gcc zshift.c && ./a.out
....Z.Z.Z..
Il y a beaucoup de discussions dans les commentaires sur une éventuelle erreur off-by-1 le code ci-dessus. Cependant, des tests/étapes simples suffisent à montrer que ce n'est pas le cas.
zshift "Z." -> ".Z"
zshift ".Z" -> "."
zshift "Z" -> ""
Je pense que le comportement de « laisser tomber » Zs de fuite lors du passage à l'extrémité de la chaîne est sensible. Après tout, si vous déplacez les bits d'un nombre entier, les bits qui se retrouvent en dehors des limites de l'entier sont supprimés.
Si un autre comportement est souhaité - par exemple, déplacer uniquement dans la chaîne - la modification de l'algorithme est minime:
temp = text[i+1];
if (temp == 0) continue;
text[i+1] = text[i];
text[i] = temp;
Vous devez donner une meilleure spécification. Quand vous dites «passer à droite», voulez-vous dire échanger le «Z» et le personnage à sa droite? Déplacer et mettre un espace (ou quelque chose) à l'endroit où il était? Que faire si le 'Z' est le dernier caractère? Quelle est la sortie correcte pour vos chaînes de test? –
Veuillez également donner la bonne réponse pour chacune des chaînes de test. Les énoncer simplement et que les solutions données ne fonctionnent pas n'est pas beaucoup d'aide. –