Crear cadenas formateadas en C

Muhammad Husnain 12 octubre 2023
  1. Crear cadenas formateadas utilizando la función sprintf() en C
  2. Crear cadenas formateadas utilizando la función snprintf() en C
Crear cadenas formateadas en C

Este artículo trata sobre cómo formatear una cadena usando el lenguaje C de la misma manera que lo hacemos en la función printf(); por ejemplo, generando una cadena combinando literales de cadena y los valores de diferentes variables y asignando el resultado a una cadena. variables para uso futuro.

El lenguaje C tiene algunos métodos de biblioteca incorporados que devuelven una cadena formateada. Las dos funciones más utilizadas de ellos son:

  1. Método sprintf()
  2. Método snprintf()

Discutiremos ambas funciones y sus ejemplos.

Crear cadenas formateadas utilizando la función sprintf() en C

El prototipo de sprintf() es el siguiente:

int sprintf(char* str, const char* format, ...);

El contenido de la cadena se almacenará como una cadena C en el búfer al que hace referencia str en lugar de imprimirse si el formato se usó en printf. El tamaño del búfer debe ser lo suficientemente grande como para contener la cadena de resultados completa.

A continuación del contenido, se inserta automáticamente un carácter nulo.

La función requiere al menos tantos argumentos adicionales como sea necesario para una correspondencia uno a uno exacta con los especificadores de formato utilizados en el segundo argumento de esta función.

Parámetros:

  • char * str

    Es un puntero de carácter donde se almacenará la cadena resultante. El tamaño de este puntero debe ser lo suficientemente grande para atender a todos los datos especificados en el formato.

  • const char * format

    También es un puntero de carácter que contiene el formato de cadena con todas las especificaciones que especificamos en la función printf.

  • ...

    La función puede requerir un conjunto de argumentos adicionales, cada uno con un valor para reemplazar un especificador de formato en la cadena de formato, según la cadena de formato (o un puntero a una ubicación de almacenamiento, para n).

    El número de estos parámetros debe ser, al menos, igual al número de valores indicados en los especificadores de formato. La función ignora cualquier argumento adicional.

Valor de retorno:

Esta función devuelve un valor int que especifica el número de caracteres escritos en la cadena resultante. Este número de caracteres no incluye el carácter nulo que se agrega automáticamente al final de la cadena.

En caso de algún error o si no se escribe nada en esa cadena, se devuelve un número negativo.

Ejemplo:

#include <stdio.h>

int main() {
  char arr[60];
  int num, i = 4, j = 2;
  num = sprintf(arr, "%d plus %d is %d", i, j, i + j);
  printf("[%s] string is %d characters long\n", arr, num);
  return 0;
}

La salida del código anterior es:

[4 plus 2 is 6] string is 13 characters long

En el fragmento de código anterior, puede ver que hemos declarado una matriz de caracteres de un tamaño fijo. Luego hemos usado esa matriz en la función sprintf para guardar el contenido.

Por ejemplo, si la cadena de format en la función sprintf supera el tamaño de la matriz especificada, se producirá un error de memoria y el programa finalizará de forma anómala. Se utiliza una versión más segura de esta función para evitar esta molestia, la función snprintf.

Crear cadenas formateadas utilizando la función snprintf() en C

El prototipo de esta función es el siguiente:

int snprintf(char* s, size_t n, const char* format, ...);

El contenido de la cadena se almacena como una cadena C en el búfer señalado por s en lugar de imprimirse si el formato se usó en printf (tomando n como la capacidad máxima del búfer para llenar).

Si, en este caso, la cadena resultante tiene un tamaño mayor que n-1, todos los caracteres adicionales restantes se descartarán para la cadena, pero se contarán para el número de caracteres en el valor de retorno.

Una vez escrito el material, se añade automáticamente un carácter nulo.

La función requiere al menos tantos argumentos adicionales como sean necesarios para el formato después del parámetro de formato.

Parámetros:

  • char * s

    Es un puntero de carácter para guardar el contenido de la cadena resultante. El tamaño de esta matriz debe tener al menos n caracteres.

  • size_t n

    Es un tipo integral sin signo que indica el número máximo de caracteres que se escribirán en el búfer. El número máximo de caracteres que se pueden escribir es n-1, dejando un carácter para el carácter nulo anexado al final de la cadena.

  • const char * format

    También es un puntero de carácter que contiene el formato de cadena con todas las especificaciones que especificamos en la función printf.

  • ...

    La función puede requerir un conjunto de argumentos adicionales, cada uno con un valor para reemplazar un especificador de formato en la cadena de formato, según la cadena de formato (o un puntero a una ubicación de almacenamiento, para n).

    El número de estos parámetros debe ser, al menos, igual al número de valores indicados en los especificadores de formato. La función ignora cualquier argumento adicional.

Valor de retorno:

Esta función devuelve el número de caracteres escritos con éxito en el búfer, excluyendo el carácter nulo de terminación. En caso de algún error, devuelve un número negativo.

Tenga en cuenta que si el valor devuelto es mayor que 0 y menor que el tamaño de búfer especificado, la cadena se escribe por completo.

Ejemplo:

#include <stdio.h>

int main() {
  char arr[100];
  int count;

  count = snprintf(arr, 100, "The double of %d is %d", 5, 5 * 2);

  if (count >= 0 && count < 100)  // check returned value
    printf("The resultant string is: %s", arr);
  else
    printf("Not successfully written");
  return 0;
}

Producción :

The resultant string is: The double of 5 is 10
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Artículo relacionado - C String