| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Xedrox
Registrado: 27 Dic 2012 Mensajes: 10
| Publicado: 13/01/2013 7:16 am | | | Título: [C] Rellenar con ceros a derecha |
| Buenas gente, estoy tratando de hacer una funcion que dado un valor, devuelva un string con ceros a derecha, pero me tira tres errorres en la linea que les remarco, como que no puede inicializar el array :S. Alguna idea? Gracias!
| Código: | char *rellenar(long long cantidad) { char *aux=(char *) malloc(10); char *resultado=(char *) malloc(20); sprintf(aux,"%lld",cantidad);
int longitud=strlen(aux); int cantidadCeros=10-longitud; char aux2[cantidadCeros]; //Esta linea da error
for(int i=0;i<cantidadCeros;i++) { aux2[i]='0'; }
sprintf(resultado,"%s%lld",aux2);
return resultado; }
|
|
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7065 Ubicación: Mexico
| Publicado: 13/01/2013 8:06 am | | | Título: |
| Al agregar ceros a la derecha modificas el valor, ¿No importa?
Y no ayudarías bastante si, cuando se generen mensajes de error, los publicas.
En el caso de compilar (como parece ser el caso, tampoco lo aclaras) el programa según el estándar C99 no debes tener problemas con la declaración pero debes verificar que el valor de la expresión "cantidadCeros" sea mayor que cero.
Por ultimo la operación que mencionas se puede realizar de una forma mas corta si después del numero imprimes un cero en un campo rellenado con (valga la redundancia) ceros a la izquierda mediante "%0*d":
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
char *rellenar(long long cantidad);
int main(void) { long long num = 12345; printf("\"%s\"\n", rellenar(num)); return EXIT_SUCCESS; }
char *rellenar(long long num) { char *p; int nc_campo = 10; /* anchura del campo */ int nc; p = malloc(nc_campo + 1); nc = sprintf(p, "%lld", num); sprintf(p + nc, "%0*d", nc_campo - nc, 0); return p; } |
Cabe señalar que ahí tampoco se verifica el numero de caracteres.
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 681 Ubicación: GRAN CANARIA
| Publicado: 17/01/2013 7:42 am | | | Título: |
| Una respuesta sencilla pero profunda, como es habitual en ti. Yo había manejado otra opción, más enrevesada claro. Pero aunque logro la cadena "1234500000" en la función, al pasarla a main me sale únicamente "". ¿Saben en que la pifio?. Gracias:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
char *rellenar(long long cantidad);
int main(void){ long long num = 12345; printf("\"%s\"\n", rellenar(num)); return EXIT_SUCCESS; }
char *rellenar(long long num){ char cadena[21]; int i,nc=10,n; n = sprintf(cadena, "%lld", num); int nf=nc-n; char aux[nf+1]; for (i=0;i<nf;i++) aux[i]='0'; aux[i]='\0'; strcat (cadena, aux); printf("\"%s\"\n", cadena); return cadena; }
|
Saluditos!. |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 7065 Ubicación: Mexico
| Publicado: 17/01/2013 8:31 am | | | Título: |
| | leosan escribió: | Yo había manejado otra opción, más enrevesada claro. Pero aunque logro la cadena "1234500000" en la función, al pasarla a main me sale únicamente "". ¿Saben en que la pifio? |
Ello se debe a que la función retorna la dirección de una variable local (en tu caso es "cadena"). Ese tipo de variables se crean justo al inicio del bloque donde son declaradas y se destruyen justo antes del final de este. La dirección era valida en la sentencia de retorno pero ya no es así cuando la procesas en la función principal.
La solución es reservar un bloque de memoria mediante una función como malloc, otra opción es declarar el array "cadena" utilizando la palabra reservada "static" (con ello el objeto perdura durante toda la ejecución del programa).
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | leosan
Registrado: 19 Abr 2012 Mensajes: 681 Ubicación: GRAN CANARIA
| Publicado: 17/01/2013 9:51 am | | | Título: |
| | rir3760 escribió: | Ello se debe a que la función retorna la dirección de una variable local (en tu caso es "cadena").
|
¡Seré torpe!, es que despistado se me queda corto. Gracias mil amigo rir. Saluditos!. P.D: Sinceramente, no sé cómo agradecerte tus aclaraciones/informaciones. Lo de "gracias" se me queda corto.
REEDITO: Me olvide poner los códigos con las indicaciones de rir. Con malloc:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
char *rellenar(long long cantidad);
int main(void) { long long num = 12345; printf("\"%s\"\n", rellenar(num)); return EXIT_SUCCESS; }
char *rellenar(long long num) { char *resultado=(char *) malloc(11); int i,longitud; longitud=sprintf(resultado,"%lld",num); int cantidadCeros=10-longitud; char aux[cantidadCeros+1]; for( i=0;i<cantidadCeros;i++) aux[i]='0'; aux[i]='\0'; strcat (resultado, aux); return resultado; }
|
Con static:
| Código: | #include <stdio.h> #include <stdlib.h> #include <string.h>
char *rellenar(long long cantidad);
int main(void){ long long num = 12345; printf("\"%s\"\n", rellenar(num)); return EXIT_SUCCESS; }
char *rellenar(long long num){ static char cadena[21]; sprintf(cadena, "%lld", num); int i,nc=10,n; n = sprintf(cadena, "%lld", num); printf("\"%d\"\n", n); int nf=nc-n; char aux[nf+1]; for (i=0;i<nf;i++) aux[i]='0'; printf("\"%d\"\n", i); aux[i]='\0'; strcat (cadena, aux); return cadena; } |
Y como curiosidad, una aplicación de sprintf para calcular los dígitos de un número:
| Código: | #include <stdio.h> #include <stdlib.h>
int digitos(long long cantidad);
int main(void){ long long num = 1234567890; printf("\"%d\"\n", digitos(num)); return EXIT_SUCCESS; }
int digitos(long long num){ char cadena[100]; int n; n = sprintf(cadena, "%lld", num); return n; }
|
Nuevamente, saluditos!. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |