Ver Mensaje Individual
  #2 (permalink)  
Antiguo 16/11/2010, 11:34
Trovaz
 
Fecha de Ingreso: octubre-2010
Ubicación: Edo. de México
Mensajes: 94
Antigüedad: 13 años, 7 meses
Puntos: 9
Respuesta: Manejo de caracteres escalonadamente

Relmente no es necesario el uso de funciones para alterar cadenas para realizar este programa, lo único que necesitas es hacerte una funcion para invertir tu cadena y realizar un par de print's.

Por ejemplo, digamos que tengo la cadena "MiCadenaMediana", y solo quiro imprimir a partir del elemento número 5, entonces debería aparecer "denaMediana", esto lo puedes hacer aprocvechando las propiedades de los apuntadores.

Como sabemos, una cadena, no es mas que un arreglo de chars, donde tu identificador es un apuntador al primer elemento de la cadena.

Código:
char cadena[100];
Cadena en este caso es el nombre de tu apuntador.

Cuando tu haces algo como:

Código:
printf("%s", cadena);
al encontrar la etiqueta %s, printf busca un apuntador al inicio de la cadena, el cual no precisamente tiene que ser el primer elemento de una cadena, por ejemplo si nosotros hacemos algo como:

Código:
printf("%s", cadena + 4);
Le estamos pasando un apuntador a una cadena, que es lo que pide printf, pero este apuntador ahora apunta al 5to elemento de esta cadena (recordando que el indice 0 es el primer elemento). por lo que esto tendra el resultado que queriamos, imprimir "denaMediana".

Ahora el problema que sigue, como imprimo solo n caractereS?, bueno eso es muy sencillo .
Cuando usamos printf podemos indicar la longitud del campo que queremos imprimir, y la precision, como este no es un curso completo de printf si no una respuesta concreta, me limitare a explicar la precision que es lo que necesitamos en este caso.

La precision indica el numero maximo de caracteres que imprimira de un campo (vease la pagina de la seccion 3 del man de la funcion printf para mayores referencias). Para indicar la precision hacemos lo siguiente, "%.ns". donde n es el numero de elementos MAXIMOS que queremos que imprima de nuestra cadena, de hecho se puede utilizar con cualquier tipo de dato, pero en nuestro caso concreto lo haremos con cadenas. Entonces si hago lo siguiente:
Código:
printf("%.4s", cadena);
Imprimiremos "MiCa", esto implicaria multiples printf's para imprimir toda la piramide
Código:
printf("%.1s\n", cadena);
printf("%.2s\n", cadena);
printf("%.3s\n", cadena);
printf("%.4s\n", cadena);
.
.
.
printf("%.ns\n", cadena); //n-simo elemento
pero por fortuna hay una forma mas "dinamica" de realizar lo anterior, el caracter especial * se puede utilizar tanto para modificar la presicion como la longitud del campo. entonces podemos tener algo como lo siguiente,

Código:
printf("%.*s", miPresicion, cadena);
El caracter especial * toma su valor de uno de los valores pasados a la funcion printf como si se tratase de cualquier otra etiqueta (%i por ejemplo). tanto la presicion como la longitud deben de ser un numero entero.

Entonces para tener el mismo efecto que el ultimo ejemplo, haremos lo siguiente.
Código:
printf("%.*s", 4, cadena);
y tambien imprimira "MiCa".
Espero haberte ayudado

Saludos++