Cadenas (Strings) y Manipulación de Cadenas en C

CBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás cómo crear y manipular cadenas (strings) en programación C. Explorarás diferentes métodos para definir cadenas, formatearlas utilizando printf, determinar su longitud con strlen y compararlas con strncmp. Estas operaciones fundamentales de cadenas son esenciales para construir aplicaciones C robustas y flexibles.

El laboratorio cubre los siguientes pasos: definir cadenas utilizando notación de punteros, definir cadenas utilizando notación de arreglos locales, formatear cadenas con printf, determinar la longitud de las cadenas con strlen y comparar cadenas con strncmp. Al final de este laboratorio, tendrás una comprensión sólida de cómo trabajar con cadenas en C y podrás aplicar estas técnicas en tus propios proyectos.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 95%. Ha recibido una tasa de reseñas positivas del 92% por parte de los estudiantes.

Definir Cadenas (Strings) Usando Notación de Punteros

En este paso, aprenderás cómo definir cadenas (strings) utilizando notación de punteros en C. La notación de punteros proporciona una forma flexible de crear y manipular cadenas en programación C.

Primero, creemos un nuevo archivo para demostrar la definición de cadenas con notación de punteros:

cd ~/project
touch string_pointer.c

Ahora, ingresa el siguiente código:

#include <stdio.h>

int main() {
    // Define a string using pointer notation
    char *greeting = "Hello, C Programming!";

    // Print the string
    printf("Greeting: %s\n", greeting);

    return 0;
}

Compila y ejecuta el programa:

gcc string_pointer.c -o string_pointer
./string_pointer

Ejemplo de salida:

Greeting: Hello, C Programming!

Analicemos el código:

  • char *greeting declara un puntero a un carácter (cadena)
  • "Hello, C Programming!" es un literal de cadena almacenado en memoria
  • El puntero greeting apunta al primer carácter de la cadena
  • printf() utiliza el especificador de formato %s para imprimir la cadena completa

También puedes modificar el puntero para que apunte a diferentes partes de la cadena:

#include <stdio.h>

int main() {
    char *greeting = "Hello, C Programming!";

    // Point to a specific part of the string
    char *partial = greeting + 7;

    printf("Original string: %s\n", greeting);
    printf("Partial string: %s\n", partial);

    return 0;
}

Ejemplo de salida:

Original string: Hello, C Programming!
Partial string: C Programming!

Definir Cadenas (Strings) Usando Notación de Arreglos Locales

En este paso, aprenderás cómo definir cadenas (strings) utilizando notación de arreglos locales en C. Este método proporciona otra forma de crear e inicializar cadenas con un control más directo sobre el arreglo de caracteres.

Creemos un nuevo archivo para demostrar la definición de cadenas utilizando notación de arreglos locales:

cd ~/project
touch string_array.c

Ingresa el siguiente código:

#include <stdio.h>

int main() {
    // Define a string using local array notation
    char greeting[30] = "Hello, C Programming!";

    // Print the string
    printf("Greeting: %s\n", greeting);

    return 0;
}

Compila y ejecuta el programa:

gcc string_array.c -o string_array
./string_array

Ejemplo de salida:

Greeting: Hello, C Programming!

Exploremos algunas variaciones de la notación de arreglos locales:

#include <stdio.h>

int main() {
    // Define an array with explicit initialization
    char name[10] = {'J', 'o', 'h', 'n', '\0'};

    // Define an array with partial initialization
    char city[20] = "New York";

    // Define an array without specifying size
    char message[] = "Welcome to C Programming!";

    printf("Name: %s\n", name);
    printf("City: %s\n", city);
    printf("Message: %s\n", message);

    return 0;
}

Ejemplo de salida:

Name: John
City: New York
Message: Welcome to C Programming!

Puntos clave sobre la notación de arreglos locales:

  • Puedes especificar el tamaño del arreglo explícitamente
  • El '\0' (terminador nulo) es crucial para marcar el final de la cadena
  • Los arreglos se pueden inicializar con caracteres individuales o como literales de cadena
  • Cuando no se inicializan completamente, los elementos restantes se establecen en cero

Formatear Cadenas (Strings) con printf

En este paso, aprenderás cómo usar printf() para formatear cadenas y varios tipos de datos en C. La función printf() ofrece poderosas capacidades de formato de cadenas.

Creemos un nuevo archivo para demostrar el formato de cadenas:

cd ~/project
touch string_formatting.c

Ingresa el siguiente código para explorar diferentes opciones de formato:

#include <stdio.h>

int main() {
    // Basic string formatting
    char name[] = "Alice";
    int age = 30;
    float height = 5.8;

    // Simple string output
    printf("Name: %s\n", name);

    // Formatting with multiple variables
    printf("Profile: %s is %d years old\n", name, age);

    // Formatting with floating-point precision
    printf("Height: %.1f meters\n", height);

    // Width and alignment
    printf("Name (right-aligned): %10s\n", name);
    printf("Name (left-aligned):  %-10s\n", name);

    // Mixing different format specifiers
    printf("Details: %s, %d years, %.1f meters\n", name, age, height);

    return 0;
}

Compila y ejecuta el programa:

gcc string_formatting.c -o string_formatting
./string_formatting

Ejemplo de salida:

Name: Alice
Profile: Alice is 30 years old
Height: 5.8 meters
Name (right-aligned):      Alice
Name (left-aligned): Alice
Details: Alice, 30 years, 5.8 meters

Especificadores de formato comunes:

  • %s: Cadenas (Strings)
  • %d: Enteros
  • %f: Números de punto flotante
  • %.1f: Números de punto flotante con 1 decimal
  • %10s: Alineado a la derecha con un ancho de 10 caracteres
  • %-10s: Alineado a la izquierda con un ancho de 10 caracteres

Exploremos un formato más avanzado:

#include <stdio.h>

int main() {
    // Hexadecimal and octal representations
    int number = 255;
    printf("Decimal: %d\n", number);
    printf("Hexadecimal: %x\n", number);
    printf("Octal: %o\n", number);

    // Padding with zeros
    printf("Padded number: %05d\n", 42);

    return 0;
}

Ejemplo de salida:

Decimal: 255
Hexadecimal: ff
Octal: 377
Padded number: 00042

Determinar la Longitud de una Cadena (String) con strlen

En este paso, aprenderás cómo usar la función strlen() para determinar la longitud de las cadenas (strings) en C. La función strlen() es parte de la biblioteca <string.h> y ofrece una forma sencilla de contar los caracteres en una cadena.

Creemos un nuevo archivo para demostrar el cálculo de la longitud de una cadena:

cd ~/project
touch string_length.c

Ingresa el siguiente código para explorar strlen():

#include <stdio.h>
#include <string.h>

int main() {
    // Define strings of different lengths
    char greeting[] = "Hello, World!";
    char name[] = "Alice";
    char empty[] = "";

    // Calculate and print string lengths
    printf("Greeting: %s\n", greeting);
    printf("Greeting length: %lu characters\n", strlen(greeting));

    printf("Name: %s\n", name);
    printf("Name length: %lu characters\n", strlen(name));

    printf("Empty string length: %lu characters\n", strlen(empty));

    return 0;
}

Compila y ejecuta el programa:

gcc string_length.c -o string_length
./string_length

Ejemplo de salida:

Greeting: Hello, World!
Greeting length: 13 characters
Name: Alice
Name length: 5 characters
Empty string length: 0 characters

Exploremos un ejemplo más práctico de cómo usar strlen():

#include <stdio.h>
#include <string.h>

int main() {
    char input[100];

    printf("Enter a string: ");
    fgets(input, sizeof(input), stdin);

    // Remove newline character if present
    input[strcspn(input, "\n")] = 0;

    // Calculate and print string length
    size_t length = strlen(input);

    printf("You entered: %s\n", input);
    printf("String length: %lu characters\n", length);

    // Demonstrate length-based operations
    if (length > 10) {
        printf("This is a long string!\n");
    } else if (length > 0) {
        printf("This is a short string.\n");
    } else {
        printf("You entered an empty string.\n");
    }

    return 0;
}

Puntos clave sobre strlen():

  • Devuelve el número de caracteres antes del terminador nulo
  • No cuenta el terminador nulo
  • Funciona con arreglos de caracteres y literales de cadena
  • Es parte de la biblioteca <string.h>, así que incluye esta cabecera
  • Devuelve un tipo size_t (entero largo sin signo)

Comparar Cadenas (Strings) con strncmp

En este paso, aprenderás cómo usar la función strncmp() para comparar cadenas (strings) en C. La función strncmp() te permite comparar un número especificado de caracteres entre dos cadenas.

Creemos un nuevo archivo para demostrar la comparación de cadenas:

cd ~/project
touch string_compare.c

Ingresa el siguiente código para explorar strncmp():

#include <stdio.h>
#include <string.h>

int main() {
    // Define strings for comparison
    char str1[] = "Hello, World!";
    char str2[] = "Hello, Everyone!";
    char str3[] = "Hello, World!";

    // Compare entire strings
    printf("Full string comparison:\n");
    int result1 = strncmp(str1, str2, strlen(str1));
    int result2 = strncmp(str1, str3, strlen(str1));

    printf("str1 vs str2: %d\n", result1);
    printf("str1 vs str3: %d\n", result2);

    // Compare first few characters
    printf("\nPartial string comparison:\n");
    int result3 = strncmp(str1, str2, 7);
    printf("First 7 characters of str1 vs str2: %d\n", result3);

    return 0;
}

Compila y ejecuta el programa:

gcc string_compare.c -o string_compare
./string_compare

Ejemplo de salida:

Full string comparison:
str1 vs str2: -1
str1 vs str3: 0

Partial string comparison:
First 7 characters of str1 vs str2: 0

Creemos un ejemplo más práctico de comparación de cadenas:

#include <stdio.h>
#include <string.h>

int main() {
    // Password verification example
    char stored_password[] = "SecretPass123";
    char input_password[20];

    printf("Enter password: ");
    scanf("%19s", input_password);

    // Compare first 10 characters of the password
    int comparison = strncmp(stored_password, input_password, 10);

    if (comparison == 0) {
        printf("Access granted!\n");
    } else {
        printf("Access denied!\n");
    }

    return 0;
}

Puntos clave sobre strncmp():

  • Compara hasta un número especificado de caracteres
  • Devuelve 0 si las cadenas coinciden para la longitud especificada
  • Devuelve un valor negativo si la primera cadena es lexicográficamente menor
  • Devuelve un valor positivo si la primera cadena es lexicográficamente mayor
  • Es parte de la biblioteca <string.h>
  • Es útil para comparaciones parciales de cadenas

Comprendiendo los valores de retorno de strncmp():

  • 0: Las cadenas son iguales para la longitud especificada
  • < 0: La primera cadena viene antes de la segunda cadena
  • 0: La primera cadena viene después de la segunda cadena

Resumen

En este laboratorio, aprendiste cómo definir cadenas (strings) utilizando tanto la notación de punteros como la notación de arreglos locales en la programación en C. Con la notación de punteros, puedes crear y manipular cadenas de manera flexible utilizando un puntero a caracteres. Con la notación de arreglos locales, tienes un control más directo sobre el arreglo de caracteres. También aprendiste cómo formatear cadenas con printf(), determinar la longitud de una cadena con strlen() y comparar cadenas con strncmp(). Estas técnicas de manipulación de cadenas son habilidades fundamentales para trabajar con datos de texto en C.