Anuncios

Bienvenidos sean a este post, hoy veremos dos formas de como convertir entre tipos de manera interna.

Anuncios
Anuncios

Ya hemos visto como trabajar con printf y scanf en posts anteriores, las cuales nos permiten hacer conversiones de manera interna ya sea desde valores binarios a cadenas (printf) y desde cadenas a valores binarios (scanf), pero tambien tenemos la posibilidad de poder hacer lo mismo pero de una forma mas interna y para ello disponemos de dos herramientas para poder hacerlo, sprintf y sscanf, y cuando nos referimos a mas interna es porque en lugar de hacerlo mediante streams utiliza un array de caracteres como origen al tipo de salida requerido, veamos como es la sintaxis de ambos:

sprintf(array_char, literal, variables);
sscanf(array_char, formateador, variables);
Anuncios

Como pueden ver son muy parecidos porque los dos comenzaran con el array de tipo char (string), luego seguiran los formateadores, en el caso de sprintf sera el literal con los formateadores y en sscanf los formateadores directos, por ultimo todas las variables que mostraremos y usaremos para recibir informacion respectivamente, para entennder el concepto vamos a crear un ejemplo, y para ello debemos crear un archivo con el nombre ejemplo35.c y le agregaremos el siguiente codigo:

ejemplo35.c

#include <stdio.h>

int main()
{
	int un_entero;
	double un_doble;
	int numPrinted=0;

	char entrada[]="2210 22145.2212345";
	char salida[80];

	sscanf(entrada,"%d%lf", &un_entero, &un_doble);

	puts("Usando sprintf() para formatear el string: ");
	numPrinted=sprintf(salida, "entero=[%d] doble=[%9.4lf]",
				un_entero, un_doble);
	printf("%d caracteres en salida \"%s\"\n", numPrinted, salida);

	return 0;
}
Anuncios
Anuncios

Este es una forma muy basica de trabajar, comencems hablando sobre el codigo, primero declaramos tres variables para almacenar los valores y otro que usaremos mas adelante con sprintf, despues tendremos dos array de tipo char, el primero seran los valores que ingresemos y el segundo sera el encargado de recibir los valores procesados, despues usamos el sscanf donde le pasaremos el primer array, seguido de los formateadores y las dos variables que recibiran los valores, despues utilizamos puts para mostrar ese mensaje en la terminal, sobre esta funcion hablaremos en el proximo post, despues utilizamos a sprintf donde pasaremos el array que sera el destino, luego pasamos el literal con los formateadores para pasar los valores almacenados en las variables, despues las variables, en numPrinted almacenamos la cantidad de caracteres, por eso en la siguiente linea lo usamos para mostrarlo y mostramos tambien el literal formateado en salida. compilemos y veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/C$ ./prog/ejemplo35
Usando sprintf() para formatear el string: 
32 caracteres en salida "entero=[2210] doble=[22145.2212]"
tinchicus@dbn001vrt:~/lenguajes/C$
Anuncios

Observen como pudimos formatearlo mediante el sprintf pero para mostrarlo en la terminal lo debemos hacerlo por medio de printf o fprintf, a continuacion hablaremos de otra forma de convertir una cadena en numeros.

Anuncios

Como dijimos tambien tenemos otra alternativa que nos provee la libreria stdlib.h son algunas funciones que nos permiten convertir string a numeros, veamos algunas de las disponibles:

  • atoi, nos permite convertir ascii en integer
  • atof, nos permite convertir ascii en float
Anuncios

Estas simplemete reciben el array de tipo char y lo convierten al tipo correspondiente pero a su vez estan derivadas de las sigueintes funciones:

  • strtol, convierte un string en un long
  • strtoll, convierte un tipo string al tipo long long
  • strtod, convierte un string al tipo double
  • strtof, convierte un string al tipo float
  • strtold, convierte un tipo string al tipo long double
Anuncios
Anuncios

Pero cual es la diferencia entre los tipos ato<tipo> y los strto<tipo>? basicamennte la forma de usarlo porque el primero simplemente debemos pasar la cadena, en cambio para el segundo debemos pasar mas parametros dado que nos permite trabajar con una parte de este en lugar de procesarlo completamente, si bien esto nos puede resultar mas util en derterminadas ocasiones pero para este caso trabajaremos con las primeras dos funciones, solamente por un tema de practicidad, para ello tomemos el ejemplo anterior y cambiemos el codigo de la siguiente manera:

ejemplo35.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char cEntero[80];
	char cDoble[80];

	printf("Ingresa un valor entero y otro con coma: ");
	scanf("%s%s", &cEntero, &cDoble);

	printf("Como strings:\nEntero=\"%s\"\nDoble=\"%s\"\n\n",
		cEntero, cDoble);

	printf("Como numeros:\nEntero=[%d]\nDoble=[%lf]\n",
		atoi(cEntero), atof(cDoble));

	return 0;
}
Anuncios
Anuncios

En este nuevo codigo primero declaramos dos arrays para almacenar un valor de tipo entero y otro de tipo double pero si observan por el momento seran de tipo char, luego pediremos que ingresen dos valores numericos, uno de tipo entero y otro con coma, observen que los almacenaremos como tipo string y en los arrays anteriores, nuestro siguiente paso sera mostrarlos indicando que son de tipo string, en la siguiente linea hacemos lo mismo pero observen que ahora en lugar de usar el formateador de cadenas usamos el de tipo entero y otro de tipo flotante, ahora para no tener errores utilizamos a las funciones atoi y atof respectivamente donde simplemente pasamos los arrays para cada uno de ellos, con esto comentado vamos a ver como trabaja mediante el siguiente video

Anuncios

Como pueden ver funciono perfectamente, si quieren prueben de quitar las funciones que usamos para convertir al momento de compilarlo nos devuelva un error porque no coinciden los tipos, con esto hemos completado las formas de trabajar con el ingreso de datos y la forma de mostrarlos, tanto con el sscanf y sprintf o con estas funciones, en el proximo nos centraremos en otra posibilidad que nos permite el lenguaje.

Anuncios

En resumen, hoy hemos visto a sscanf y sprintf, que son, como trabajan, como nos permiten convertir un determinado tipo de dato en otro, despues vimos otras dos funciones que nos permiten hacer lo mismo pero de una manera mas practica, espero les haya siddo de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50