SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Lerele_333 en Sábado 25 de Abril de 2009, 00:25

Título: Insertar ceros por la izquierda
Publicado por: Lerele_333 en Sábado 25 de Abril de 2009, 00:25
Muy buenas a todos,

Soy nuevo en este foro y en primer lugar queria agredeceros la labor que haceis ayudandonos a todos aquellos que tenemos duduas.

En segundo lugar mi pregunta:

Queria saber como podría insertar un cero por la izquierda a un número en C, es decir, lo que intento es que al hacer una llamada al servicio "creat(argv[],permisos)" pueda tener en permisos (que es un int o float o double) un numero del tipo 0664. Mi problema es que unicamente consigo tener "permisos=664" lo que hace que el fichero se no se cree con los permisos deseados.
Título: Re: Insertar ceros por la izquierda
Publicado por: su - en Sábado 25 de Abril de 2009, 16:46
Se puede hacer con sprintf() (http://www.opengroup.org/onlinepubs/009695399/functions/sprintf.html)
Título: Re: Insertar ceros por la izquierda
Publicado por: Halos en Sábado 25 de Abril de 2009, 22:27
El problema no creo que sea añadir un 0 a la izquiera, el problema es que lo que tu quieres pasarle como parámetro a la función es un número en octal, que se nota de esa manera.
Si obtienes los permisos desde el terminal, al leerlos de éste en vez de hacerlo por ejemplo scanf("%d",&permiso), deberías hacer que se interpretara como octal: scanf("%o",&premiso).
Título: Re: Insertar ceros por la izquierda
Publicado por: haevan en Jueves 14 de Mayo de 2009, 13:29
Para aquellos que entraron atraidos por el asunto del hilo:

si tenemos un entero valor (del que partimos):

Código: C
  1. int i=4-strlen(atoi(valor));
  2. sprintf(resultado,"%4s",valor);
  3. while(i--)
  4.   if (resultado[i]==32) resultado[i]='0';
  5.  

No lo he probado (si hay algun detalle que me lo chafe me habre despistado), pero la base es esa

EDITO: Esta mal, se me volvio a ir la olla , con el atoi queria hacer todo lo contrario (pasar de entero a cadena)

cambiad
Código: C
  1. atoi(valor)
  2.  
por
Código: Text
  1. sprintf(NULL,"%s",valor)
  2.  
en la linea 1
Título: Re: Insertar ceros por la izquierda
Publicado por: m0skit0 en Jueves 14 de Mayo de 2009, 16:10
Cita de: "Halos"
el problema es que lo que tu quieres pasarle como parámetro a la función es un número en octal
Creo que tienes razón, Halos. La solución más sencilla, Lerele_333, es convertir los permisos a decimal. De esta forma, 0664 es 436. Por tanto, si ponemos int permisos=436 (que es lo mismo que si pones int permisos=0664) seguro que te funciona perfectamente.

Cita de: "haevan"
si hay algun detalle que me lo chafe me habre despistado
Si valor es un número entero... atoi(valor) no tiene ningún sentido entonces. Habrás querido decir itoa(valor, buffer, 10), y habría que declarar un char *buffer con suficiente espacio para que quepa la cadena resultante. Esto habría que hacerlo dependiendo del entero valor y por tanto con malloc(). En fin, bastante más complicado de cómo lo pintas ;) Ah, y no te olvides las etiquetas de código  ^_^

Saludos
Título: Re: Insertar ceros por la izquierda
Publicado por: haevan en Viernes 15 de Mayo de 2009, 14:17
Cita de: "m0skit0"
Si valor es un número entero... atoi(valor) no tiene ningún sentido entonces. Habrás querido decir itoa(valor, buffer, 10), y habría que declarar un char *buffer con suficiente espacio para que quepa la cadena resultante. Esto habría que hacerlo dependiendo del entero valor y por tanto con malloc(). En fin, bastante más complicado de cómo lo pintas ;) Ah, y no te olvides las etiquetas de código  ^_^

Saludos

corregido http://#p143207 (a mi forma... no he usado itoa porque soy de linux y en linux itoa no tiene referencia en man) gracias por el aviso

Aclaracion: sprintf devuelve un puntero a la cadena resultante, como no la voy a guardar en ninguna variable uso NULL como destino

un puntero es una direccion de memoria (4 bytes independientemente de lo larga que sea la cadena), no guarda los datos en si
Título: Re: Insertar ceros por la izquierda
Publicado por: m0skit0 en Sábado 16 de Mayo de 2009, 19:58
Cita de: "haevan"
no he usado itoa porque soy de linux y en linux itoa no tiene referencia en man) gracias por el aviso
itoa es estándar: http://linux.die.net/man/3/itoa (http://linux.die.net/man/3/itoa" onclick="window.open(this.href);return false;)
Título: Re: Insertar ceros por la izquierda
Publicado por: locazopro en Sábado 16 de Mayo de 2009, 21:22
Cita de: "m0skit0"
Cita de: "haevan"
no he usado itoa porque soy de linux y en linux itoa no tiene referencia en man) gracias por el aviso
itoa es estándar

estoy prácticamente seguro que no lo es. :o
Título: Re: Insertar ceros por la izquierda
Publicado por: Eternal Idol en Sábado 16 de Mayo de 2009, 21:55
Ahi mismo dice que no lo es.

This file declares some basic C macros and functions as defined by the ISO standard, plus some AVR-specific extensions.

Non-standard (i.e. non-ISO C) functions.

char * ltoa (long int __val, char *__s, int __radix)
char * utoa (unsigned int __val, char *__s, int __radix)
char * ultoa (unsigned long int __val, char *__s, int __radix)
long random (void)
void srandom (unsigned long __seed)
long random_r (unsigned long *ctx)
char * itoa (int __val, char *__s, int __radix)
Título: Re: Insertar ceros por la izquierda
Publicado por: haevan en Domingo 17 de Mayo de 2009, 04:01
Cita de: "m0skit0"
Cita de: "haevan"
no he usado itoa porque soy de linux y en linux itoa no tiene referencia en man) gracias por el aviso
itoa es estándar

Cita de: "locazopro"

estoy prácticamente seguro que no lo es. :o

tanto si lo es como si no... si tengo el man y el sprintf que me hace lo que yo quiero... ¿para que voy a ir a la web a buscar el itoa? xD la flojera me puede sorry

EI: juntando mensajes consecutivos del mismo usuario.

Cita de: "m0skit0"
Si valor es un número entero... atoi(valor) no tiene ningún sentido entonces. Habrás querido decir itoa(valor, buffer, 10), y habría que declarar un char *buffer con suficiente espacio para que quepa la cadena resultante. Esto habría que hacerlo dependiendo del entero valor y por tanto con malloc(). En fin, bastante más complicado de cómo lo pintas ;) Ah, y no te olvides las etiquetas de código  ^_^

otra cosa que no entiendo es que tenga que reservar memoria, cuando lo que estoy haciendo no es un volcado de datos, si no hacer que mi puntero char apunte a la direccion de memoria que devuelve sprintf