Comment faire pivoter la chaîne donnée à gauche ou à droite en C?

Fonction C pour faire pivoter une chaîne d’un nombre donné vers la droite ou vers la gauche. Lorsqu’un personnage est tourné au-delà de la fin ou du début d’une chaîne, il doit envelopper

étant donné une chaîne str qui a la longueur length et une quantité de rotation n

tourner à gauche est équivalent à

 reverse(str, 0, n); reverse(str, n, length); reverse(str, 0, length); 

tourner à droite est équivalent à

 reverse(str, 0, length - n); reverse(str, length - n, length); reverse(str, 0, length); 

Maintenant, vous avez juste besoin d’une fonction inverse.

Mise à jour: j’ai réfléchi à la façon dont vous pouvez utiliser les mods pour vous faire toujours pivoter dans le bon sens en fonction du signe de n .

par exemple

 int mod = n % length; if (mod != 0) { //if 0, don't rotate reverse(str, 0, mod); reverse(str, mod, length); reverse(str, 0, length); } 

en passant par les différents cas

si n == 5 et longueur = 10, mod = 5

si n == 16 et longueur = 10, mod = 6 – rotation à gauche de 16 = rotation à gauche de 6

si n == 0 et longueur = rien, mod = 0

si n == -1 et longueur = 10, mod = 9 – tourner à droite de 1 équivaut à tourner à gauche de 9

si n == -15 et longueur = 9, mod = 3 – une rotation à droite de 15 équivaut à une rotation à gauche de 3

Je ferais quelque chose comme ça:

 void rot(char *buf, int len, int r) { char *temp=malloc(r>=0?r:-r); if(r>=0) { memcpy(temp, buf+len-r, r); memmove(buf+r, buf, len-r); memcpy(buf, temp, r); } else { memcpy(temp, buf, r); memmove(buf, buf+r, len-r); memcpy(buf+len-r, temp, r); } free(temp); } 

à condition bien sûr que l

Déplacement d’éléments dans un tableau C ++

Aussi, http://www.cs.bell-labs.com/cm/cs/pearls/s02b.pdf

 #include  #include  #include  char* strrot (int offset, size_t size, const char *inStr); int main (int argc, const char * argv[]) { const char *rotStr = "rotateme"; size_t rotStrSize = strlen(rotStr); char *resultStr; resultStr = strrot(-3, rotStrSize, rotStr); printf("-3, %s\n", resultStr); free(resultStr); resultStr = strrot(2, rotStrSize, rotStr); printf("+2, %s\n", resultStr); free(resultStr); resultStr = strrot(11, rotStrSize, rotStr); printf("+11, %s\n", resultStr); free(resultStr); resultStr = strrot(0, rotStrSize, rotStr); printf("0, %s\n", resultStr); free(resultStr); resultStr = strrot(-11, rotStrSize, rotStr); printf("-11, %s\n", resultStr); free(resultStr); return 0; } char* strrot (int offset, size_t size, const char *inStr) { char *result = (char *)malloc(size * sizeof(char)); int trueOffset = size - (offset % size); int inIndex = trueOffset; int outIndex = 0; for (inIndex = trueOffset; inIndex < (int)size; inIndex++, outIndex++) { result[outIndex] = inStr[inIndex]; } for (inIndex = 0; inIndex < trueOffset; inIndex++, outIndex++) { result[outIndex] = inStr[inIndex]; } result[(int)size] = '\0'; return result; } 

Résultats:

 -3, atemerot +2, merotate +11, emerotat 0, rotateme -11, atemerot