Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Uso de cadenas de caracteres en C: scanf() vs. gets(), Diapositivas de Programación C

El uso de cadenas de caracteres en el lenguaje C, con un enfoque especial en la función scanf() y gets(). Se discuten los problemas que se pueden encontrar al utilizar scanf() para leer cadenas de texto y cómo gets() puede solucionarlos. Además, se presentan algunas funciones de la librería string.h que son útiles para manipular cadenas de caracteres.

Tipo: Diapositivas

2019/2020

Subido el 10/02/2022

soap-v
soap-v 🇪🇨

4 documentos

1 / 13

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Vista previa parcial del texto

¡Descarga Uso de cadenas de caracteres en C: scanf() vs. gets() y más Diapositivas en PDF de Programación C solo en Docsity!

Facultad de Ciencias Informáticas

“Fundamentos de Programación”

Aplicar validaciones en el registro de datos mediante

“Hacer … mientas (do ... while())”

Conocer y aplicar el almacenamiento mediante la

definición de arreglos de datos.

scanf() Vs. gets para leer cadenas de caracteres

La función gets () pertenece a la misma librería de scanf(), solo puede obtener los datos para una variable de tipo cadena de texto (char), no puede ser utilizada para

obtener y transformar cantidades o datos calculables, es decir no admite variables de tipo (int, log, float o double), para su uso necesita que el buffer no este

seccionado, es decir no funciona después de usar un scanf(), esta función permite el ingreso ilimitado de caracteres desde el teclado.

El siguiente código fuente utiliza gets () para leer una cadena de texto, observe cuales serían los resultados de aplicarlo (este programa lo puede descargar con el

nombre string2.cpp ):

#include <stdio.h>

#include <stdlib.h>

main()

{ char frase[40];

system("cls");

printf("ingrese una frase:");

gets(frase);

printf("lo ingresado es:\n %s \n",frase);

system("pause");

return 0;

frase

Dios perdona si te arrepientes

Pantalla:

Al ingresar la frase: Dios perdona si te arrepientes

lo ingresado es:

Dios perdona si te arrepientes

Observe que toda la frase se ingresa a la variable, aquí el problema del uso del espacio no afecta el contenido del buffer

puts (cadena_caracteres): Esta función pertenece a la librería stdio.h , se la utiliza para mostrar cadenas de

caracteres, esta función a diferencia de printf() no necesita el uso del “\n”, ya que de forma automática produce

un salto de línea.

#include <stdio.h>

#include <stdlib.h>

void main()

{ char cadena[50];

system("cls");

puts("escriba su nombre y apellido:"); gets(cadena);

printf("eres afortunado:");

puts(cadena);

system("pause");

cadena

Gabriel Demera

Pantalla:

escriba su nombre y apellido:

eres afortunado:

Gabriel Demera

Press any keys to continue.

scanf () genera distribuciones y seccionamientos en el uso del buffer (memoria temporal entre el teclado y la RAM), que en el ejemplo C27A

observará que no funciona gets () después de utilizar scanf (), ya que se produce un seccionamiento en el buffer , C27B , gets () funciona ya que no

utiliza memoria seccionada y scanf () la secciona después:

#include <stdio.h>

#include <stdlib.h>

void main(){

char cadena[50];

int a;

system(“cls”);

printf(“ingrese un entero: “);

scanf(“%d”,&a);

printf(“ingrese otra cadena: “);

gets(cadena);

printf(“el entero ingresado es:%d\n”,a);

printf(“la cadena ingresada es:”);

puts(cadena);

system(“pause”);

C27A.cpp

Cuando se incluye la función printf ( ) y la función puts () en el mismo programa no afecta el normal desenvolvimiento del programa;

El problema surge al utilizar gets () y scanf (), el uso de la función gets () está limitada al ingreso de cadenas de caracteres , mientras que la función

scanf () es una instrucción mucho más amplia en cuanto a sus posibilidades en la que puede ser utilizada para diferentes tipos de datos,

cadena a Pantalla:

ingrese un entero:

ingrese otra cadena:

el entero ingresado es:

la cadena ingresada es:

123

123

Observe que no se ingresa la cadena de texto porque cuando se utiliza primero scanf()

y secciona el buffer no funciona gets() , es un error del cual no es responsabilidad del

programador.

Lenguaje C incluye dentro de la librería string.h alguna funciones que permiten solventar estas necesidades, por ejemplo:

Las variables utilizan los operadores aritméticos, de comparación y lógicos para procesar datos y obtener información o

resultados, estos operadores trabajan con un dato o valor y no con grupos de datos o valores, por ejemplo, 15 > 6 esta

correcto porque compara si 15 es mayor que 6, pero no se puede aplicar: 7, 25, 14 > 6, 15, 23 tenga en cuenta que se están

comparando dos grupos de valores. Lo mismo sucedería al aplicar un cálculo, por ejemplo, 16 + 25 es una expresión correcta,

pero 2, 58, 8, 20 + 3, 4, 78 no se puede aplicar.

Considerando estos principios y que una cadena de caracteres, no es posible utilizar los operadores de comparación (= =, >, <,

etc) al igual que el operador de asignación (=) que no sea una inicialización, ya que estos operadores están desarrollados para

operar sobre un valor o dato y no sobre varios valores o datos al mismo tiempo.

memchr() memcmp() memcpy() memmove() memset() strcat() strchr()

strcmp() strcoll() strcpy() strcspn() strerror() strlen() strmcat()

strmcmp() strmcpy() strpbrk() strrchr() strspn() strstr() strtok()

strxfrm()

strlen (cadena_caracteres): Esta función devuelve el número de caracteres o la longitud de la cadena, sin tomar en cuenta el carácter de final de

cadena ‘\0’. Por ejemplo, suponga que se tienen dos cadenas de texto:

La función printf() devolverá como resultado:

strlen(c1) = 4

strlen(c2) = 37

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

main()

{char frase[100] ;

system("cls");

printf("ingrese una frase:");

gets( frase );

printf("lo ingresado es:\n %s \n", frase );

printf("la frase tiene %d caracteres\n",strlen( frase ));

system("pause");

return 0;

char c1[50] = "Dios";

char c2[] = "siempre perdona cuando te arrepientes";

Al aplicar la función strlen():

printf( "strlen(c1) = %d\nstrlen(c2) = %d\n", strlen(c1), strlen(c2) );

El siguiente código fuente permite el ingreso de una cadena de caracteres para volverla a mostrar indicando el número de caracteres ingresados (este programa lo

puede descargar con el nombre string3.cpp ):

frase

Pantalla:

ingrese una frase:

Nos preparamos para esta vida pero jamás para la próxima

Nos preparamos para esta vida pero jamás para la próxima

lo ingresado es:

Nos preparamos para esta vida pero jamás para la próxima

la frase tiene 56 caracteres

El conteo incluye también a los espacios

strcat ( cadena_destino , cadena_origen ). Esta función permite unir dos cadenas de texto en una sola, funciona concatenando el contenido de

cadena_origen al final de la cadena_destino, el resultado total quedará en cadena_destino.

Se mostrará el siguiente resultado

c1= Estudiar da frutos

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

main()

{char frase[100] , frase2[100 ]="usted piensa:";

system("cls");

printf("ingrese una frase:");

gets( frase );

printf("lo ingresado es:\n %s \n", frase );

printf("la frase tiene %d caracteres\n",strlen( frase ));

strcat( frase2 , frase );

printf("lo concatenado es:\n %s \n", frase2 );

system("pause");

return 0;

char c1[20] = "estudiar ";

char c2[11] = "da frutos";

Al aplicar la función:

strcat( c1, c2 );

Para mostrar la concatenación se utiliza:

printf( "c1=%s", c1 );

El siguiente código fuente permite unir dos cadenas de caracteres en una sola variable (este programa lo puede descargar con el nombre string5.cpp ):

frase

Pantalla:

ingrese una frase:

Muerte significa apartado de la fuente de vida que es Dios

Muerte significa apartado de la fuente de vida que es Dios

lo ingresado es:

Muerte significa apartado de la fuente de vida que es Dios

la frase tiene 58 caracteres

frase

Muerte significa apartado de la fuente de vida que es Dios

lo concatenado es:

usted piensa: Muerte significa apartado de la fuente de vida que es Dios

usted piensa:

strcmp ( cadena1 , cadena2 ) y strcmpi ( cadena1 , cadena2 ): Estas funciones reemplazan los operadores de comparación ( == , > , < ) para comparar

las cadenas de caracteres, funciona comparando cadena1 y cadena2 , se conoce la diferencia o la igualdad de las dos cadenas dependiendo del

resultado que arroja la función, el siguiente cuadro muestra los tres posibles resultados:

SI EL RESULTADO ES: SIGNIFICA:

0 Que ambas cadenas de caracteres son iguales.

Mayor que 0 Que cadena 1 es mayor que cadena 2.

Menor que 0 Que cadena 1 es menor que cadena 2 o dicho de otra forma cadena 2 es mayor que cadena 1.

El resultado de este ejemplo es:

Son diferentes

El resultado de este ejemplo es:

Son iguales

Asumiendo que se tienen dos cadenas de caracteres inicializadas con la misma palabra, cual sería el resultado de compararlas:

char c1[6] = "Abeja";

char c2[6] = "abeja";

char c1[6] = "Abeja";

char c2[6] = "abeja";

Al comparar las cadenas de caracteres

if( strcmp(c1, c2 ) == 0 ) printf( "Son iguales" );

else printf( "Son diferentes" );

Al comparar las cadenas de caracteres

if( strcmpi(c1, c2 ) == 0 ) printf( "Son iguales" );

else printf( "Son diferentes" );

En este ejemplo la comparación se realiza mediante los

códigos, así el código de la A(65) es diferente de la a(97)

por eso el resultado es diferente

En este ejemplo la comparación se realiza mediante los

caracteres, así la A es igual a la a por eso el resultado es

igual

CONCLUSIONES

✓ La función scanf() es útil para obtener datos de todos los tipos de datos pero cuando se trata de cadena de

caracteres se recomienda utilizar gets().

✓ Cuando se desea combinar scanf y gets se recomienda utilizar fflush antes del gets para evitar que deje

funcionar el gets.

✓ Los operadores aritméticos, de comparación y lógicos trabajas con valores individuales y no en grupos, por lo

que para trabajar con cadenas de texto se debe utilizar la librería string.h que proporcionan funciones para

éstas operaciones

✓ Las comparaciones de las cadenas de caracteres se las pueden realizar mediante el código o el caracter.