Diferencia entre revisiones de «sprintf()»

De ArduWiki
Saltar a: navegación, buscar
(Retorno)
(Ejemplo 3)
 
(No se muestran 36 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
== Descripción ==
 
== Descripción ==
Escribir datos formateados en una cadena
+
Crea una cadena tipo [[string]] formateada en la variable str, en lugar de imprimir.
Compone una cadena con el mismo texto que se imprimirá si se usó el formato en printf, pero en lugar de imprimirse, el contenido se almacena como una cadena C en el búfer señalado por str .  
+
 
 +
El tamaño del búfer debe ser lo suficientemente grande como para contener toda la cadena resultante (vea [[snprintf()] para una versión más segura).
 +
 
 +
Un carácter nulo de terminación se agrega automáticamente después del contenido.
 +
 
 +
Después del parámetro de formato, la función espera al menos tantos argumentos adicionales como sea necesario para el formato.
  
 
== Sintaxis ==
 
== Sintaxis ==
Línea 9: Línea 14:
  
 
== Parámetros ==
 
== Parámetros ==
;str: Puntero a un buffer donde se almacena el C-string resultante.  
+
;str:Puntero a un buffer donde se almacena la cadena tipo [[string]] resultante. El buffer debe ser lo suficientemente grande como para contener la cadena resultante.
El buffer debe ser lo suficientemente grande como para contener la cadena resultante.
+
;formato:Cadena que contiene el formato que sigue las mismas especificaciones que el formato en [[printf()]]. Puedes representar [[int]] (%d), [[long]] (%ld) y [String|cadenas] (%s).
;formato: Cadena que contiene una cadena de formato que sigue las mismas especificaciones que el formato en '''printf'''.
+
;argumentos:Dependiendo de la cadena de formato, la función puede esperar una secuencia de argumentos adicionales, cada uno con un valor que se utilizará para reemplazar un especificador de formato en la cadena de formato (o un puntero a una ubicación de almacenamiento, para n). Debe haber al menos tantos de estos argumentos como la cantidad de valores especificados en los especificadores de formato.
;argumentos: Dependiendo de la cadena de formato , la función puede esperar una secuencia de argumentos adicionales, cada uno con un valor que se utilizará para reemplazar un especificador de formato en la cadena de formato (o un puntero a una ubicación de almacenamiento, para n ).  
+
 
Debe haber al menos tantos de estos argumentos como la cantidad de valores especificados en los especificadores de formato .
+
{| class="wikitable"
 +
|+Especificadores disponibles como formato
 +
|-
 +
! Especificador !! Descripción !! Ejemplo
 +
|-
 +
| %d o %i || [[int]] formato decimal || 392
 +
|-
 +
| %0d o %0i || [[int]] formato decimal || 03
 +
|-
 +
| %o || [[int]] formato octal || 610
 +
|-
 +
| &u || [[unsigned int]] || 7235
 +
|-
 +
| %x o %X || [[unsigned int]] formato hexadecimal || 12345
 +
|-
 +
| %f o %F || [[float]] formato decimal || 3.1416
 +
|-
 +
| %a o %A || [[float]] formato hexadecimal || 0XC.90FEP-2
 +
|-
 +
| %e o %E || Notación científica || 3.9263e+2
 +
|-
 +
| %c || Carácter || a
 +
|-
 +
| %s || Cadena de caracteres || Hola
 +
|-
 +
| %p || Puntero || b80000000
 +
|-
 +
| %n || No imprime ||
 +
|-
 +
| %% || simbolo % || %
 +
|}
  
 
== Retorno ==
 
== Retorno ==
En caso de éxito, se devuelve la cantidad total de caracteres escritos. Este recuento no incluye el carácter nulo adicional adjuntado automáticamente al final de la cadena.  
+
* En caso de éxito, se devuelve la cantidad total de caracteres escritos. Este recuento no incluye el carácter nulo adicional adjuntado automáticamente al final de la cadena.  
En caso de falla, se devuelve un número negativo.
+
* En caso de falla, se devuelve un número negativo.
  
== Advertencias ==
+
== Comentarios ==
 
* La función ignora argumentos adicionales.
 
* La función ignora argumentos adicionales.
* El tamaño del búfer debe ser lo suficientemente grande como para contener toda la cadena resultante (ver '''snprintf''' para una versión más segura).
 
 
* Un carácter nulo de terminación se agrega automáticamente después del contenido.  
 
* Un carácter nulo de terminación se agrega automáticamente después del contenido.  
 
* Después del parámetro de formato, la función espera al menos tantos argumentos adicionales como sea necesario para el formato.
 
* Después del parámetro de formato, la función espera al menos tantos argumentos adicionales como sea necesario para el formato.
 +
* No maneja [[float]] pero lo puedes imitar con dos enteros.
 +
 +
== Advertencias ==
 +
* La función sprintf() no hace el trabajo de imprimir, solo prepara una variable para ello.
 +
* El tamaño del búfer debe ser lo suficientemente grande como para contener toda la cadena resultante (ver [[snprintf]] para una versión más segura).
 +
 +
== Ejemplo 1 ==
 +
Esto tiene 3 enteros de 2 dígitos con ceros a la izquierda, separados por ":". La lista de parámetros, hora, minuto, segundo, proporciona los números con los que se imprime el sprintf.
  
== Ejemplo ==
 
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
  char buffer[50];
 +
  byte hora = 13;
 +
  byte min = 2;
 +
  byte seg = 18;
 +
  sprintf(buffer, "%02d:%02d:%02d", hora, min, seg);
 +
  Serial.print(buffer);          //13:02:18
 +
  sprintf(buffer, "Son las %d horas %d minutos %d segundos.", hora, min, seg);
 +
  Serial.println(buffer);      //Son las 13 horas 2 minutos 18 segundos.
 +
}
 +
void loop(){
 +
  //Nada
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 2 ==
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
  char buffer[50];
 +
  int n, a=5, b=3;
 +
  n = sprintf(buffer, "%d plus %d is %d", a, b, a+b);
 +
  printf("[%s] is a string %d chars long\n",buffer,n);
 +
  Serial.print(buffer);
 +
}
 +
void loop(){
 +
  //Nada
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 3 ==
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  char buffer[30];
 +
  char buf1[6];
 +
  float mfloat = 23.245;
 +
  dostrf(mfloat, 5, 2, buf1);
 +
  sprintf(buffer,"Float %s", buf1);
 +
  Serial.print(buffer);
 +
}
 +
void loop(){
 +
  //Nada
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 4 ==
 +
<syntaxhighlight lang="c++">
 +
void setup(){
 +
  Serial.begin(9600);
 +
  char texto[50];
 +
  int a=5, b=3;
 +
  sprintf(texto, "%d mas %d es %d", a, b, a+b);
 +
  Serial.print(texto);
 +
}
 +
void loop(){
 +
  //Nada.
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 5 ==
 +
<syntaxhighlight lang="c++">
 +
#include <RTClib.h>
 +
#include <SD.h>
 +
RTC_Millis rtc;
 +
File Archivo;
 +
void setup(){
 +
  pinMode(10, OUTPUT);  //Se establece como salida el pin correspondiente a SS.
 +
  //Estado SD
 +
  if (!SD.begin(10)) {
 +
      Serial.println("Se ha producido un fallo al iniciar la comunicación");
 +
      return;
 +
  }
 +
  Serial.println("Se ha iniciado la comunicación correctamente");
 +
  char archivo[13];
 +
  sprintf(archivo, "%4d%02d%02d.txt", year, month, day);
 +
  /*** INICIO ESCRITURA ***/
 +
  Archivo = SD.open(archivo, FILE_WRITE);
 +
  if (Archivo) {
 +
    Archivo.println("Esto es lo que se está escribiendo en el archivo");
 +
    Archivo.close();
 +
    Serial.println("Todos los datos fueron almacenados");
 +
  }else{
 +
    Serial.println("El archivo no se abrió correctamente");
 +
  }
 +
  /* FIN ESCRITURA */
 +
 +
  /*** INICIO LECTURA ***/
 +
  Archivo = SD.open(archivo);
 +
  if (Archivo) {
 +
    Serial.println("Información contenida en archivo: ");
 +
    While (Archivo.available()) {
 +
      Serial.write(Archivo.read());
 +
    }
 +
    Archivo.close();
 +
  }else{
 +
    Serial.println("El archivo no se abrió correctamente");
 +
  }
 +
  /* FIN LECTURA */}
 +
void loop(){
 +
  //Si tengo algún dato para escribir
 +
  if(tengo){
 +
      /*** INICIO ESCRITURA ***/
 +
      Archivo = SD.open(archivo, FILE_WRITE);
 +
      if (Archivo) {
 +
        Archivo.print(year);
 +
        Archivo.print("Valor pin 11: ");
 +
        Archivo.println(digitalRead(11));
 +
        Archivo.close();
 +
        Serial.println("Dato almacenado");
 +
      }else{
 +
        Serial.println("El archivo no se abrió correctamente");
 +
      }
 +
      /* FIN ESCRITURA */
 +
  }
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
== Vea también ==
 
== Vea también ==
* [[F()]]
+
<categorytree mode=all>Serial</categorytree>
* [[Serial.print()]]
 
* [[Serial.println()]]
 
  
 
== Referencias ==
 
== Referencias ==
* [http://www.cplusplus.com/reference/cstdio/sprintf/ cplusplus]
+
* [http://www.cplusplus.com/reference/cstdio/sprintf/ sprint()] - cplusplus
 +
* [https://programarfacil.com/blog/arduino-blog/conversion-de-numeros-a-cadenas-en-arduino/ Convesion de numeros a cadena] - Luis del Valle
  
[[Category:Funciones]]
+
[[Category:Serial]]

Revisión actual del 01:12 28 may 2019

Descripción

Crea una cadena tipo string formateada en la variable str, en lugar de imprimir.

El tamaño del búfer debe ser lo suficientemente grande como para contener toda la cadena resultante (vea [[snprintf()] para una versión más segura).

Un carácter nulo de terminación se agrega automáticamente después del contenido.

Después del parámetro de formato, la función espera al menos tantos argumentos adicionales como sea necesario para el formato.

Sintaxis

sprintf(str, formato, argumentos);

Parámetros

str
Puntero a un buffer donde se almacena la cadena tipo string resultante. El buffer debe ser lo suficientemente grande como para contener la cadena resultante.
formato
Cadena que contiene el formato que sigue las mismas especificaciones que el formato en printf(). Puedes representar int (%d), long (%ld) y [String|cadenas] (%s).
argumentos
Dependiendo de la cadena de formato, la función puede esperar una secuencia de argumentos adicionales, cada uno con un valor que se utilizará para reemplazar un especificador de formato en la cadena de formato (o un puntero a una ubicación de almacenamiento, para n). Debe haber al menos tantos de estos argumentos como la cantidad de valores especificados en los especificadores de formato.
Especificadores disponibles como formato
Especificador Descripción Ejemplo
 %d o %i int formato decimal 392
 %0d o %0i int formato decimal 03
 %o int formato octal 610
&u unsigned int 7235
 %x o %X unsigned int formato hexadecimal 12345
 %f o %F float formato decimal 3.1416
 %a o %A float formato hexadecimal 0XC.90FEP-2
 %e o %E Notación científica 3.9263e+2
 %c Carácter a
 %s Cadena de caracteres Hola
 %p Puntero b80000000
 %n No imprime
 %% simbolo %  %

Retorno

  • En caso de éxito, se devuelve la cantidad total de caracteres escritos. Este recuento no incluye el carácter nulo adicional adjuntado automáticamente al final de la cadena.
  • En caso de falla, se devuelve un número negativo.

Comentarios

  • La función ignora argumentos adicionales.
  • Un carácter nulo de terminación se agrega automáticamente después del contenido.
  • Después del parámetro de formato, la función espera al menos tantos argumentos adicionales como sea necesario para el formato.
  • No maneja float pero lo puedes imitar con dos enteros.

Advertencias

  • La función sprintf() no hace el trabajo de imprimir, solo prepara una variable para ello.
  • El tamaño del búfer debe ser lo suficientemente grande como para contener toda la cadena resultante (ver snprintf para una versión más segura).

Ejemplo 1

Esto tiene 3 enteros de 2 dígitos con ceros a la izquierda, separados por ":". La lista de parámetros, hora, minuto, segundo, proporciona los números con los que se imprime el sprintf.

void setup(){
   Serial.begin(9600);
   char buffer[50];
   byte hora = 13;
   byte min = 2;
   byte seg = 18;
   sprintf(buffer, "%02d:%02d:%02d", hora, min, seg);
   Serial.print(buffer);          //13:02:18
   sprintf(buffer, "Son las %d horas %d minutos %d segundos.", hora, min, seg);
   Serial.println(buffer);       //Son las 13 horas 2 minutos 18 segundos.
}
void loop(){
   //Nada
}

Ejemplo 2

void setup(){
   Serial.begin(9600);
   char buffer[50];
   int n, a=5, b=3;
   n = sprintf(buffer, "%d plus %d is %d", a, b, a+b);
   printf("[%s] is a string %d chars long\n",buffer,n);
   Serial.print(buffer);
} 
void loop(){
   //Nada
}

Ejemplo 3

void setup(){
   char buffer[30];
   char buf1[6];
   float mfloat = 23.245;
   dostrf(mfloat, 5, 2, buf1);
   sprintf(buffer,"Float %s", buf1);
   Serial.print(buffer);
}
void loop(){
   //Nada
}

Ejemplo 4

void setup(){
   Serial.begin(9600);
   char texto[50];
   int a=5, b=3;
   sprintf(texto, "%d mas %d es %d", a, b, a+b);
   Serial.print(texto);
} 
void loop(){
   //Nada.
}

Ejemplo 5

#include <RTClib.h>
#include <SD.h>
RTC_Millis rtc;
File Archivo;
void setup(){
   pinMode(10, OUTPUT);   //Se establece como salida el pin correspondiente a SS.
   //Estado SD
   if (!SD.begin(10)) {
      Serial.println("Se ha producido un fallo al iniciar la comunicación");
      return;
   }
   Serial.println("Se ha iniciado la comunicación correctamente");
   char archivo[13];
   sprintf(archivo, "%4d%02d%02d.txt", year, month, day);
   /*** INICIO ESCRITURA ***/
   Archivo = SD.open(archivo, FILE_WRITE);
  if (Archivo) {
     Archivo.println("Esto es lo que se está escribiendo en el archivo");
     Archivo.close();
     Serial.println("Todos los datos fueron almacenados");
  }else{
     Serial.println("El archivo no se abrió correctamente");
  }
  /* FIN ESCRITURA */

  /*** INICIO LECTURA ***/
  Archivo = SD.open(archivo);
  if (Archivo) {
    Serial.println("Información contenida en archivo: ");
    While (Archivo.available()) {
      Serial.write(Archivo.read());
    }
    Archivo.close();
  }else{
    Serial.println("El archivo no se abrió correctamente");
  }
  /* FIN LECTURA */} 
void loop(){
   //Si tengo algún dato para escribir
   if(tengo){
      /*** INICIO ESCRITURA ***/
      Archivo = SD.open(archivo, FILE_WRITE);
      if (Archivo) {
         Archivo.print(year);
         Archivo.print("Valor pin 11: ");
         Archivo.println(digitalRead(11));
         Archivo.close();
         Serial.println("Dato almacenado");
      }else{
         Serial.println("El archivo no se abrió correctamente");
      }
      /* FIN ESCRITURA */
   }
}

Vea también


Referencias