Noticias Programación

C fundamental – E/S de cadena

Artículo Índice fundamental C – E/S de cadena de E/S de bajo nivel

Página 1 de 2

Este extracto, de mi libro sobre programación C en un contexto de IoT, explica que las cadenas no son tan fáciles de usar. Debe saber cómo obtener cadenas del mundo exterior y convertirlas a tipos de datos C.


C fundamental: acercarse al coche

Ahora disponible como libro de tapa blanda y libro electrónico de Amazon.

Acerca de C
Extraer Empleado v Independiente
& Comportamiento indefinido Primeros pasos con C Uso de estructuras de control NetBeans y variables de datos
Extraer variables aritméticas y representación
Extraer operadores y expresiones aritméticas y de representación
Extracto: Expresiones
Extraer efectos secundarios, puntos de secuencia y evaluación perezosa
Primer borrador de este capítulo: Alcance de las funciones de datos de bajo nivel y matrices de duración
Extraer arreglos simples
Extraer cadenas de enumeración
Extraer cadenas simples
Extraer: String I/O *** ¡NUEVO! Punteros
Extraer los punteros de inicio
Extraiga punteros, moldee y escriba Punning Structs
Extraer estructuras básicas
Extraer tipo de definición
Manipulación de bits
Extraer bits básicos
Extraer giros y rotaciones
Expediente
Extrae los archivos
Extraer archivos de acceso aleatorio

Compilación C: preprocesador, compilador, enlazador
Extracto de compilación y preprocesador



Ver también el volumen complementario: Aplicación de C

Esto le sorprenderá si programa en casi cualquier otro lenguaje: C en realidad no tiene cadenas en el sentido de la mayoría de los lenguajes. Todo lo que tiene son matrices de caracteres y algunas convenciones sobre cómo se usan. Todavía es importante saber cómo funcionan, y hay algunas características adicionales más allá de una simple matriz.

En el capítulo pero no en este extracto

Cadenas Funciones de gestión de cadenas Desbordamiento de búfer

Convertir a cadena – sprintf

Ya sabe cómo convertir un patrón de bits en una cadena legible por humanos usando printf. La función de cadena sprintf (formato de impresión de cadena) funciona exactamente igual pero devuelve una cadena en lugar de imprimir la cadena.

Todas las cadenas de formato funcionan con sprintf, la única diferencia real es que devuelve una cadena.

Por ejemplo:

sprintf (myString, «El resultado =% 10d», 1234);

Si le preocupa que la función devuelva una cadena, tenga en cuenta que debe proporcionar una cadena que tenga suficiente espacio de almacenamiento para almacenar el resultado. El ejemplo realmente debería ser:

char miCadena[25]; sprintf (myString, «El resultado =% 10d», 1234);

El resultado es una cadena formateada exactamente como la ve impresa almacenada en myString. Es posible que no vea el motivo sprintf completo en este momento, pero es muy útil si está trabajando con cualquier tipo de pantalla no estándar y necesita obtener una representación del carácter para enviarla. De manera más general, puede usarlo como una forma de convertir cualquier tipo de datos en una cadena que puede procesarse más.

También hay algunas funciones más simples que convierten tipos particulares de datos en cadenas sin ninguna especificación de formato. Nos vemos.

Entrada – Problemas de búfer

También vale la pena saber que la función scanf leerá una cadena del dispositivo de entrada estándar, generalmente el teclado, usando una cadena de formato que es la misma que printf. El usuario debe proporcionar datos que de otro modo provendrían de las variables en un printf.

Por ejemplo, para que el usuario ingrese algunos caracteres como una cadena, debe usar:

scanf («% s», miCadena);

La mayoría de las introducciones a C explican cómo se puede usar para obtener información y mostrar ejemplos que a menudo no funcionan como se esperaba. Hay una serie de problemas significativos con scanf y, de hecho, con tratar de obtener información de un usuario.

El mayor problema es que si está ejecutando C con un sistema operativo completo, la entrada del teclado generalmente se almacenará en búfer. Es decir, a medida que el usuario escribe en el teclado, los códigos de caracteres se almacenan en un búfer incluso si no se utiliza la entrada. Cuando se utiliza scanf en el programa, lee del búfer en lugar de interactuar directamente con el teclado.

También vale la pena saber que la salida enviada al dispositivo de visualización también se almacena en búfer y aparece en la pantalla solo cuando envía una nueva línea o cuando sale del programa. Con demasiada frecuencia, esto causa problemas cuando se pregunta por qué no se muestra lo que «imprimió» en la pantalla.

Considere el siguiente programa simple:

char miCadena[25]; printf («¿Cuál es tu nombre?»); scanf («% s», miCadena); printf («Hola% s», miCadena);

La intención es que el usuario vea el mensaje «¿Cuál es su nombre?» y luego escriba una respuesta. En la mayoría de los sistemas, incluidos Windows y Linux, el programa parece bloquearse. La razón es que el mensaje va al búfer de salida y permanece allí. Si no hay nada en el búfer de entrada, scanf también simplemente espera a que se escriba algo. El usuario no tiene ninguna indicación de que debe escribir nada. Si escriben algo, no sucede nada hasta que presionan Enter una o dos veces y luego ves la pregunta y la respuesta cuando el programa sale y el búfer de salida se vacía.

Hay muchas maneras de arreglar esto, pero la más común es usar fflush (stdin) y fflush (stdout) específicos del sistema que vacían los búferes afectados en muchos sistemas operativos.

Entonces, si prueba el programa usando fflush:

char miCadena[25]; printf («¿Cuál es tu nombre?»); fflush (salida estándar); fflush (entrada estándar); scanf («% s», miCadena); printf («Hola% s», miCadena);

verá aparecer el mensaje y podrá escribir un nombre. Sin embargo, es posible que no vea lo que escribe y que deba ingresar dos retornos para que funcione.

Si ve o no lo que escribe depende de la consola que esté usando el programa y de si el eco está activado o desactivado. Si el eco está desactivado, no verá lo que escribe. Bajo NetBeans, la consola interna no repite lo que escribe. Para habilitar el eco, haga clic con el botón derecho en el proyecto y seleccione Propiedades. En la pestaña Ejecutar, seleccione Salida estándar para el tipo de consola. Ahora podrá ver lo que escribe en respuesta a un scanf.

Otro problema con el uso de scanf es que las cadenas de formato fallan en el primer error de coincidencia y esto deja caracteres en el búfer para confundir el próximo intento de lectura. El especificador de formato % s solo se lee mientras el primer carácter de espacio en blanco, lo que significa que incluir espacios en los nombres, por ejemplo, lo rompe. Lo que es peor es que el espacio en blanco no impide que scanf lea datos del búfer; después de todo, podría haber otro especificador de formato. Muchos de los especificadores de formato omiten los caracteres de entrada en lugar de dejar de intentar leer los datos.

Por ejemplo:

scanf («% d», & número);

funcionará como se espera si escribe 123 return, por ejemplo, pero si escribe algo que no sean números, incluida una línea en blanco, la máquina generalmente parecerá congelada. La razón es que% d omitirá todos los espacios en blanco, incluido el retorno de carro, hasta que encuentre algunos dígitos y un retorno.

Hay muchos otros «problemas» con el uso de scanf y se necesitaría un capítulo dedicado para enumerarlos todos, pero por lo general puede averiguar qué está pasando averiguando exactamente qué está buscando un especificador de formato y recordando que está trabajando con un tampón. .

En la mayoría de los casos, es mejor evitar usar scanf para obtener información de un usuario. A menudo escuchará el consejo: no use scanf. En realidad, esto es demasiado extremo. Cuando se trata de leer datos formateados almacenados en un archivo o secuencia, scanf puede ser útil. La razón es que un archivo o secuencia generalmente tiene un formato fijo y claro y puede adaptar el formato scanf para que se ajuste. Además, si algo sale mal, a menudo puede hacer una copia de seguridad e intentarlo de nuevo.

También vale la pena comentar que, para aplicaciones de bajo nivel, la entrada de teclado generalmente no es un problema ya que no hay teclado. Para aplicaciones de nivel superior puede haber un teclado, pero generalmente se necesita una forma más avanzada de interfaz de usuario y para esto necesita una biblioteca o marco: ncurses para consola y Qt para una GUI completa. Estos generalmente tienen sus propias funciones de E/S. Sin embargo, para trabajar con la entrada del teclado, necesitamos un método alternativo para manejar la entrada del usuario.

También puede gustarte...