/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

[C] Rellenar con ceros a derecha

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Xedrox



Registrado: 27 Dic 2012
Mensajes: 10

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com