Autor Tema: Funcion sprintf  (Leído 9454 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Funcion sprintf
« en: 16 de Octubre de 2009, 10:07:11 »
Hola grupo, les consulto por lo siguiente:

Estoy utilizando la función sprintf de la siguiente forma

char   bcd[8];
entero_8b = 123;
sprintf(bcd,"%u",entero_8b);

bcd es una matriz de 6 caracteres y entero_8b = 123, luego bcd queda cargada con 123???; necesito formatear de tal forma que los caracteres de la izquierda se rellenen con ceros, ejemplo: 000123.

Otra inquietud: si quisiera rellenar la matriz BCD con un texto, algo así como sprintf(bcd,"%u","texto"); como podría hacerlo

muchas gracias.

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Funcion sprintf
« Respuesta #1 en: 16 de Octubre de 2009, 10:35:13 »
Hola,

Citar
necesito formatear de tal forma que los caracteres de la izquierda se rellenen con ceros, ejemplo: 000123.

Código: C
  1. sprintf(bcd,"%06u",entero_8b);

El cero indica el caracter con que queres paddear ( se llama asi este tipo de cosas ) y el número, en este caso 6 indica cual es el largo fijo que va a tener el string resultante.

Citar
Otra inquietud: si quisiera rellenar la matriz BCD con un texto, algo así como sprintf(bcd,"%u","texto"); como podría hacerlo

De dos maneras, simplemente podes strcpy o tambien sprintf

Código: C
  1. strcpy( bcd, "Hola" );
  2. sprintf(bcd,"Hola" );

De mas esta decir que el tamaño del texto tiene que ser menor al largo de bcd - 1

Saludos !

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Funcion sprintf
« Respuesta #2 en: 16 de Octubre de 2009, 12:54:24 »
RICHI777, era exactamente lo que necesitaba.

mil gracias

saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Funcion sprintf
« Respuesta #3 en: 16 de Octubre de 2009, 12:56:55 »
En CCS pulsando F12 se abre la ayuda, colocando printf se muestra la función y al final varios ejemplos. Para la próxima  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Funcion sprintf
« Respuesta #4 en: 16 de Octubre de 2009, 14:11:42 »
Gracias Suky.

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: Funcion sprintf
« Respuesta #5 en: 22 de Diciembre de 2010, 12:49:40 »
Hola aprovecho este post para no abrir otro  :) Estoy teniendo un problema con la funcion sprintf();. Todo funciona correctamente con las variables del tipo FLOAT siempre y cuando no sean menores a 1, por ejemplo si le envío a la función un 0.8 retorna un 0.0008 o un 0.123 depende del caso que use, lo mas aproximado lo he tenido con %f y %g pero realizan una especie de redonde por lo tanto al tener un 0.2 por ejemplo me lo redondean a 0, en el caso de %f me saca un valor que nada que ver, como debería configurar el sprintf()? EL objetivo de poner el numero en la matriz es para presentarlo en un GLCD.

Saludos y gracias!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Funcion sprintf
« Respuesta #6 en: 23 de Diciembre de 2010, 09:39:54 »
Hola amigo, dependiendo como lo formatees te dará estos resultados

int cadena[10];

sprintf(cadena,"%f",0.123456789);       // = 0.12
sprintf(cadena,"%010.2f",0.123456789);    // = 000000.12
sprintf(cadena,"%010.5f",0.123456789);    // = 0000.12345
sprintf(cadena,"%010.8f",0.123456789);    // = 0.12345678

saludos

Desconectado dragondgold

  • PIC16
  • ***
  • Mensajes: 103
    • Tmax & Gwolf Microcontrollers
Re: Funcion sprintf
« Respuesta #7 en: 23 de Diciembre de 2010, 15:53:25 »
Gracias Diego E. al parecer el problema no estaba en el sprintf sino en la variable que me quedaba siempre a 0 porque estaba diviendo una variale INT sobre 10 y me daba numero con coma por debajo de 1 y me lo dejaba en 0, lo solucioné colocando (float) delante de la variable:

FLOAT a;
INT b;

a = b / 10      <----- No funciona

a = (FLOAT)b / 10     <------ Funciona

Saludos y gracias!!
La conclusión final es que sabemos muy poco y sin embargo, es asombroso lo mucho que conocemos. Y más asombroso todavía es que un conocimiento tan pequeño nos pueda dar tanto poder

Desconectado tgo.aviña

  • PIC10
  • *
  • Mensajes: 2
Re: Funcion sprintf
« Respuesta #8 en: 02 de Mayo de 2014, 00:38:58 »
Hola que tal!!

Estoy intentando escribir en un LCD ya logre proyectar caracteres y la pantalla pero quisiera poner manipular el texto durante el programa.
Mi codigo es algo asi.

char letra[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J'};
int x;

for( x = 0; x<20; x++ )
{
   WriteData(letra
  • );

}

De esa manera escribo en mi LCD pero quisiera poder modificar el valor de mi variable letra use sprintf de la siguiente manera pero no se si este comentiendo algun error.

sprintf(letra, "Hola");

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Funcion sprintf
« Respuesta #9 en: 05 de Diciembre de 2015, 09:05:19 »
Hola  Amigos , tengo una duda con esta funcion sprintf , todo bien hasta que me empezo a recortar el string y no se porque ..esto es lo que hago

salida[30]
cliente [15]
counter[15]
cpassword[15]


sprintf(salida,"GET /carpeta123/carpeta12.php?n=%s&numero=%s&passw=%s HTTP/1.0\r\n",&cliente,&counter,&cpasword);
USARTWriteString(salida);
USARTWriteString("Host: ramiro2.com.ar\r\n\r\n");
 

el resultado de esto deberia ser

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0 Host: ramiro2.com.ar


y sin embargo me da esto

GET /carpeta123/carpeta12.php?n=2&numero=000& Host: ramiro2.com.ar


los char estan cargados de antemano con 2 , 000 y  ramiro2

lo que hago es pasar una direccion a una pagina web


Alguien me da una mano que no me doy cuenta que es lo que pasa

Muchas gracias a todos
« Última modificación: 05 de Diciembre de 2015, 09:08:33 por Rseliman »
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Funcion sprintf
« Respuesta #10 en: 05 de Diciembre de 2015, 09:26:25 »
salida[30]

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0

Conta cuantos caracteres tenes, tenes 30 en el "?" inclusive. Ese es un primer error. Acordate que son todos los char + un 0x00. Arregla eso a un buffer de mayor tamaño (68 el minimo para tu ejemplo) y luego se verifica si sigue el problema, para mi estas escribiendo otros datos, por que normalmente las funciones de texto esperan un caracter nulo '\0' para terminar su funcion.

Luego de verlo estoy mas seguro de eso, Si tenes:

salida[30]
cliente [15]

Estos serian 45 caracteres sin contar el 0x00

GET /carpeta123/carpeta12.php?n=2&numero=000&

Hay que ver como se maneja el sprintf por dentro + como esta la RAM en ese momento para verificar el funcionamiento y ver por que se detiene ahi y no sigue "sobrescribiendo" mas datos

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Funcion sprintf
« Respuesta #11 en: 05 de Diciembre de 2015, 09:43:28 »
Gracias KILLERJC

Me parece que no me da mas la RAM ....verifico  y comento ...no me habia dado cuenta

Mil Gracias



salida[30]

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0

Conta cuantos caracteres tenes, tenes 30 en el "?" inclusive. Ese es un primer error. Acordate que son todos los char + un 0x00. Arregla eso a un buffer de mayor tamaño (68 el minimo para tu ejemplo) y luego se verifica si sigue el problema, para mi estas escribiendo otros datos, por que normalmente las funciones de texto esperan un caracter nulo '\0' para terminar su funcion.

Luego de verlo estoy mas seguro de eso, Si tenes:

salida[30]
cliente [15]

Estos serian 45 caracteres sin contar el 0x00

GET /carpeta123/carpeta12.php?n=2&numero=000&

Hay que ver como se maneja el sprintf por dentro + como esta la RAM en ese momento para verificar el funcionamiento y ver por que se detiene ahi y no sigue "sobrescribiendo" mas datos
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Funcion sprintf
« Respuesta #12 en: 05 de Diciembre de 2015, 09:58:40 »
Ya lo solucione ...parti el String en dos ...


Muchas gracias !!!!!!!





Gracias KILLERJC

Me parece que no me da mas la RAM ....verifico  y comento ...no me habia dado cuenta

Mil Gracias



salida[30]

GET /carpeta123/carpeta12.php?n=2&numero=000&passw=ramiro2 HTTP/1.0

Conta cuantos caracteres tenes, tenes 30 en el "?" inclusive. Ese es un primer error. Acordate que son todos los char + un 0x00. Arregla eso a un buffer de mayor tamaño (68 el minimo para tu ejemplo) y luego se verifica si sigue el problema, para mi estas escribiendo otros datos, por que normalmente las funciones de texto esperan un caracter nulo '\0' para terminar su funcion.

Luego de verlo estoy mas seguro de eso, Si tenes:

salida[30]
cliente [15]

Estos serian 45 caracteres sin contar el 0x00

GET /carpeta123/carpeta12.php?n=2&numero=000&

Hay que ver como se maneja el sprintf por dentro + como esta la RAM en ese momento para verificar el funcionamiento y ver por que se detiene ahi y no sigue "sobrescribiendo" mas datos
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Funcion sprintf
« Respuesta #13 en: 05 de Diciembre de 2015, 10:06:14 »
** Esto lo escribi y cuando fue a publicarlo, aparecio tu respuesta, asi que no lo modifique para nada **

No te da mas la RAM ?

- Envialo a la flash

const char text1[33]="GET /carpeta123/carpeta12.php?n=";  //Esto en flash
const char text2[12]=" HTTP/1.0\r\n"; // Esto en flash
char salida[30];


USARTWriteString(text1);
sprintf(salida,"%s&numero=%s&passw=%s",&cliente,&counter,&cpasword);
USARTWriteString(salida);
USARTWriteString(text2);

Esto obviamente si es posible leer de la flash, si hay lugar en la flash y tambien si no te importa la demora que ocasione leer de la Flash, aunque creo que nunca va a importar con esas funciones lo de la demora

- Otra es intentar "reutilizar" algun buffer que tengas y que no sea necesario

- Si vas a mantener numeros, para el counter por ejemplo o el cliente. mejor mantenelo en variables con numeros enteros,
y que luego el mismo sprintf los formatee. Ejemplo:

counter[15]

Eso ocupa 15 bytes, encima es complejo de realizar operaciones aritmeticas como suma por ejemplo(trata de sumarle 1 a ese contador). Tendrias 14 digitos decimales para ese valor.
99.999.999.999.999 , bastante grande para un contador creo

32 bits = Hasta 4.294.967.296 ( Solo 10 digitos y  no por completo para tenerlos todos en 9, pero... Creo que es suficiente para un contador)
Y ocupas solo 4 bytes. Contra esos 15.

Igual el cliente. Maximo 24 bits. No creo que manejes una base de datos de 16 millones de personas. parece un poco exagerado, o tal ves 16 bits es suficiente como para 65k de personas


EDIT, algo que me acabo de dar cuenta... un password por GET y sin encriptar ? :/

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re:Funcion sprintf
« Respuesta #14 en: 05 de Diciembre de 2015, 10:51:04 »
Muchas gracias Killerjc ...ok a todos los comentarios ...


tema passw por get ...si si es cierto muy desprotegido ...como lo harias ??







** Esto lo escribi y cuando fue a publicarlo, aparecio tu respuesta, asi que no lo modifique para nada **

No te da mas la RAM ?

- Envialo a la flash

const char text1[33]="GET /carpeta123/carpeta12.php?n=";  //Esto en flash
const char text2[12]=" HTTP/1.0\r\n"; // Esto en flash
char salida[30];


USARTWriteString(text1);
sprintf(salida,"%s&numero=%s&passw=%s",&cliente,&counter,&cpasword);
USARTWriteString(salida);
USARTWriteString(text2);

Esto obviamente si es posible leer de la flash, si hay lugar en la flash y tambien si no te importa la demora que ocasione leer de la Flash, aunque creo que nunca va a importar con esas funciones lo de la demora

- Otra es intentar "reutilizar" algun buffer que tengas y que no sea necesario

- Si vas a mantener numeros, para el counter por ejemplo o el cliente. mejor mantenelo en variables con numeros enteros,
y que luego el mismo sprintf los formatee. Ejemplo:

counter[15]

Eso ocupa 15 bytes, encima es complejo de realizar operaciones aritmeticas como suma por ejemplo(trata de sumarle 1 a ese contador). Tendrias 14 digitos decimales para ese valor.
99.999.999.999.999 , bastante grande para un contador creo

32 bits = Hasta 4.294.967.296 ( Solo 10 digitos y  no por completo para tenerlos todos en 9, pero... Creo que es suficiente para un contador)
Y ocupas solo 4 bytes. Contra esos 15.

Igual el cliente. Maximo 24 bits. No creo que manejes una base de datos de 16 millones de personas. parece un poco exagerado, o tal ves 16 bits es suficiente como para 65k de personas


EDIT, algo que me acabo de dar cuenta... un password por GET y sin encriptar ? :/
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!