• Jueves 14 de Noviembre de 2024, 17:06

Autor Tema:  Insertar ceros por la izquierda  (Leído 6015 veces)

Lerele_333

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Insertar ceros por la izquierda
« en: Sábado 25 de Abril de 2009, 00:25 »
0
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.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Insertar ceros por la izquierda
« Respuesta #1 en: Sábado 25 de Abril de 2009, 16:46 »
0
Se puede hacer con sprintf()
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Halos

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Insertar ceros por la izquierda
« Respuesta #2 en: Sábado 25 de Abril de 2009, 22:27 »
0
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).

haevan

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Insertar ceros por la izquierda
« Respuesta #3 en: Jueves 14 de Mayo de 2009, 13:29 »
0
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
« última modificación: Viernes 15 de Mayo de 2009, 14:21 por haevan »

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Insertar ceros por la izquierda
« Respuesta #4 en: Jueves 14 de Mayo de 2009, 16:10 »
0
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

haevan

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Insertar ceros por la izquierda
« Respuesta #5 en: Viernes 15 de Mayo de 2009, 14:17 »
0
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

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Insertar ceros por la izquierda
« Respuesta #6 en: Sábado 16 de Mayo de 2009, 19:58 »
0
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

locazopro

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: Insertar ceros por la izquierda
« Respuesta #7 en: Sábado 16 de Mayo de 2009, 21:22 »
0
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

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Insertar ceros por la izquierda
« Respuesta #8 en: Sábado 16 de Mayo de 2009, 21:55 »
0
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)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

haevan

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Insertar ceros por la izquierda
« Respuesta #9 en: Domingo 17 de Mayo de 2009, 04:01 »
0
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