Hoy vamos a resolver un ejercicio propuesto en C. Se trata del trabajo con cadenas, vamos a solicitar dos cadenas y a partir de ellas hacer determinadas cosas. El problema dice así:
Escribir un programa que solicite dos cadenas que puede contener espacios, el programa deberá:
Al finalizar el programa, este deberá:
Veamos cómo resolver este problema usando ANSI C.
Para escanear cadenas con espacios será necesario el uso de fgets en lugar de scanf.
Leyendo las restricciones vemos que vamos a comparar cadenas, para ello vamos a usar la función strcmp.
Después vemos que vamos a convertir algunas letras a mayúsculas, en el primer caso si son vocales y en el segundo si son consonantes. Para ello usaremos unas funciones que ya expliqué anteriormente.
Luego vamos a crear cadenas, así que necesitamos copiarlas usando strcpy
. Para el caso de concatenar, será necesario el uso de strcat
.
Finalmente para invertir la cadena vamos a recorrerla cadena de fin a inicio e imprimir cada carácter, ya que el ejercicio no pide que almacenemos el resultado en una cadena distinta, pero si así fuera, ya existe una función para ello.
Al terminar el ejercicio vamos a imprimir todas las cadenas justo como fue solicitado.
Comencemos a resolver las solicitudes. El primer requisito es escanear las cadenas con espacios:
char cadena1[MAXIMA_LONGITUD] = "";
char cadena2[MAXIMA_LONGITUD] = "";
printf("\nIngresa la cadena 1: ");
fgets(cadena1, MAXIMA_LONGITUD, stdin);
cadena1[strcspn(cadena1, "\r\n")] = 0;
printf("\nIngresa la cadena 2: ");
fgets(cadena2, MAXIMA_LONGITUD, stdin);
cadena2[strcspn(cadena2, "\r\n")] = 0;
Ahora vamos a usar strcmp
para saber cuál cadena es mayor alfabéticamente. Recordemos que strcmp
regresa 0 si las cadenas son iguales, un número menor que 0 si la primer cadena es menor que la segunda, y un número mayor que 0 si la primer cadena es mayor que la segunda.
// Decir cuál es mayor y cuál es menor
int resultado = strcmp(cadena1, cadena2);
if (resultado >= 0)
{
printf("Mayor: '%s'. Menor: '%s'\n", cadena1, cadena2);
}
else
{
printf("Mayor: '%s'. Menor: '%s'\n", cadena2, cadena1);
}
Llega el turno del siguiente paso, el cual es convertir las vocales de la primera cadena en mayúsculas, y las consonantes de la segunda igualmente en mayúsculas.
Lo primero que tenemos que hacer es copiar las cadenas, después recorrerlas e ir modificando el carácter si es que es necesario. El código queda así:
// Cadena 1 con vocales mayúsculas
char cadena1VocalesMayusculas[MAXIMA_LONGITUD] = "";
strcpy(cadena1VocalesMayusculas, cadena1);
int i = 0;
for (i = 0; i < strlen(cadena1VocalesMayusculas); i++)
{
char letraActual = cadena1VocalesMayusculas[i];
if (esVocal(letraActual))
{
letraActual = toupper(letraActual);
}
cadena1VocalesMayusculas[i] = letraActual;
}
// Cadena 2 con consonantes mayúsculas
char cadena2ConsonantesMayusculas[MAXIMA_LONGITUD] = "";
strcpy(cadena2ConsonantesMayusculas, cadena2);
for (i = 0; i < strlen(cadena2ConsonantesMayusculas); i++)
{
char letraActual = cadena2ConsonantesMayusculas[i];
if (esConsonante(letraActual))
{
letraActual = toupper(letraActual);
}
cadena2ConsonantesMayusculas[i] = letraActual;
}
Ya casi terminamos. Ahora vamos a hacer el siguiente paso del ejercicio y es concatenar las cadenas modificadas. Eso lo hacemos con strcat
y queda así:
// Cadena concatenando las dos anteriores
// Nota: asegúrate de que la longitud alcance
char cadenaConcatenada[MAXIMA_LONGITUD] = "";
strcat(cadenaConcatenada, cadena1VocalesMayusculas);
strcat(cadenaConcatenada, " ");
strcat(cadenaConcatenada, cadena2ConsonantesMayusculas);
El último requisito es imprimir la cadena concatenada anteriormente pero de manera invertida. Para ello hacemos lo siguiente:
printf("Cadena concatenada invertida: '");
for (i = strlen(cadenaConcatenada) - 1; i >= 0; i--)
{
printf("%c", cadenaConcatenada[i]);
}
printf("'\n");
Ahora veamos el código completo que solicita ambas cadenas al usuario e imprime todo lo solicitado. Queda así:
/*
https://parzibyte.me/blog
*/#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXIMA_LONGITUD 100
int esVocal(char letra)
{
// Convertir para simplificar comparaciones
char letraMinuscula = tolower(letra);
char vocales[] = "aeiou";
// Recorrer las vocales y comparar si la letra es una de ellas
int i;
for (i = 0; vocales[i]; i++)
{
if (letraMinuscula == vocales[i])
{
return 1;
}
}
// Si terminamos de recorrer y no regresamos true dentro del for, entonces no es vocal
return 0;
}
int esConsonante(char letra)
{
return isalpha(letra) && !esVocal(letra);
}
int main(int argc, char const *argv[])
{
char cadena1[MAXIMA_LONGITUD] = "";
char cadena2[MAXIMA_LONGITUD] = "";
printf("\nIngresa la cadena 1: ");
fgets(cadena1, MAXIMA_LONGITUD, stdin);
cadena1[strcspn(cadena1, "\r\n")] = 0;
printf("\nIngresa la cadena 2: ");
fgets(cadena2, MAXIMA_LONGITUD, stdin);
cadena2[strcspn(cadena2, "\r\n")] = 0;
// Decir cuál es mayor y cuál es menor
int resultado = strcmp(cadena1, cadena2);
if (resultado >= 0)
{
printf("Mayor: '%s'. Menor: '%s'\n", cadena1, cadena2);
}
else
{
printf("Mayor: '%s'. Menor: '%s'\n", cadena2, cadena1);
}
// Cadena 1 con vocales mayúsculas
char cadena1VocalesMayusculas[MAXIMA_LONGITUD] = "";
strcpy(cadena1VocalesMayusculas, cadena1);
int i = 0;
for (i = 0; i < strlen(cadena1VocalesMayusculas); i++)
{
char letraActual = cadena1VocalesMayusculas[i];
if (esVocal(letraActual))
{
letraActual = toupper(letraActual);
}
cadena1VocalesMayusculas[i] = letraActual;
}
// Cadena 2 con consonantes mayúsculas
char cadena2ConsonantesMayusculas[MAXIMA_LONGITUD] = "";
strcpy(cadena2ConsonantesMayusculas, cadena2);
for (i = 0; i < strlen(cadena2ConsonantesMayusculas); i++)
{
char letraActual = cadena2ConsonantesMayusculas[i];
if (esConsonante(letraActual))
{
letraActual = toupper(letraActual);
}
cadena2ConsonantesMayusculas[i] = letraActual;
}
// Cadena concatenando las dos anteriores
// Nota: asegúrate de que la longitud alcance
char cadenaConcatenada[MAXIMA_LONGITUD] = "";
strcat(cadenaConcatenada, cadena1VocalesMayusculas);
strcat(cadenaConcatenada, " ");
strcat(cadenaConcatenada, cadena2ConsonantesMayusculas);
// Resultados
printf("Cadena 1: '%s'\n", cadena1);
printf("Cadena 2: '%s'\n", cadena2);
printf("Cadena 1 con vocales mayúsculas: '%s'\n", cadena1VocalesMayusculas);
printf("Cadena 2 con consonantes mayúsculas: '%s'\n", cadena2ConsonantesMayusculas);
printf("Cadena concatenada: '%s'\n", cadenaConcatenada);
printf("Cadena concatenada invertida: '");
for (i = strlen(cadenaConcatenada) - 1; i >= 0; i--)
{
printf("%c", cadenaConcatenada[i]);
}
printf("'\n");
return 0;
}
Al ejecutarlo, la salida es correcta:
En mi blog puedes ver más ejercicios y posts sobre C.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.