¿Cómo girar la cadena dada a la izquierda o derecha en C?

Función C para rotar una cadena por un número dado a la derecha o a la izquierda. Cuando se rota un carácter más allá del final o el principio de una cadena dependiendo de la dirección, debe enrollarse

dada una cadena str que tiene longitud de length y una cantidad de rotación n

girar a la izquierda es equivalente a

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

girar a la derecha es equivalente a

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

Ahora solo necesitas una función inversa.

Actualización: Pensé en cómo puedes usar mod’s para hacerte girar siempre en la dirección correcta dependiendo del signo de n .

p.ej

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

pasando por los diversos casos

si n == 5 y longitud = 10, mod = 5

si n == 16 y longitud = 10, mod = 6 – girando a la izquierda en 16 = girando a la izquierda en 6

si n == 0 y longitud = nada, mod = 0

si n == -1 y longitud = 10, mod = 9 – girar a la derecha en 1 es lo mismo que girar a la izquierda en 9

si n == -15 y longitud = 9, mod = 3 – girar a la derecha en 15 es igual a girar a la izquierda en 3

Haría algo como esto:

 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); } 

siempre que, por supuesto, r

Desplazando elementos en una matriz C ++

Además, 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; } 

Resultados:

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