Saltar a contenido

StringC v1

Notas previas

  • Se presupone dominio de estructuras iterativas (bucles) y arrays (en el lenguaje que sea y, en particular, en Java)
  • También se ven las funciones de librería printf(), scanf(), fgets(), strcpy() y strcat()
  • Declaración de tipos: typedef
  • En todo caso, se recomienda revisar la documentación de todas las funciones (librerías del sistema) utilizadas en el ejercicio

En C, propiamente hablando, no existe el tipo String sino que se implementa como un array de caracteres terminados por el carácter especial \0. La figura siguiente muestra la memoria ocupada por la cadena Hello
String Presentation in C/C++

De conformidad con lo anterior, las operaciones con strings (copiar, concatenar, calcular la longitud, etc.) se convierten en operaciones con arrays. El siguiente programa contiene dos funciones cpystr1() y catstr1(), este última incompleta (ejercicio propuesto) que, respectivamente, copia un string str1 en otro string str2 y concatena dos strings str1 y str2 en un tercer string str3

StringCv1.c
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
 * StringC.c
 *
 *  Created on: 21/09/2015
 *      Author: santiago
 * 
 * gcc -Wall -Wextra -Werror -ansi -pedantic StringCv1.c -o bin/strc1
 */

/*
 * Definición de ctes simbólicas. Tarea para el preprocesador
 */
#define OK 0
#define MAX 50

/*
 * Guías ultra-rápida:
 * https://www.tutorialspoint.com/c_standard_library/stdio_h.htm
 * https://www.tutorialspoint.com/c_standard_library/stdlib_h.htm
 * https://www.tutorialspoint.com/c_standard_library/string_h.htm
 * Man on-line:
 * http://man7.org/linux/man-pages/index.html
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * Ejemplo de cabecera de función
 * Esto es una declaración de función. Luego vendrá la definición
 * Realmente ahora no es necesario. Lo normal es que vaya en un
 * fichero de cabeceras (.h)
 */
void cpystr1 (void);

/*
 * Copiar MANUALMENTE un string en otro string (OJO, ambos son arrays)
 * Se lee la entrada con scanf hasta pulsar enter/return
 * El problema es que leyendo con scanf no se introduce el \0 fin de string
 * Solución, se introduce explícitamente el fin de cadena (\0)
 */

void cpystr1 (void) {
    char str1[MAX+1], str2[MAX+1]; /* OJO: reserva memoria (estática) */
    int i;

    printf("Teclear string (max MAX caracteres): ");
    /*
       Leer carácter a carácter con scanf. OJO porque scanf se para
       en los espacios en blanco
       Para resolverlo se introduce la secuencia de formato [^\n]
       Se introduce el fin de cadena en la instrucción de la línea #61
     */
    scanf("%[^\n]s", str1);

    /* copiar el string: bucle recorriendo un array */
    for(i=0; i<MAX && str1[i]!='\0'; i++)
    {
        str2[i]=str1[i];
    }
    str2[i]='\0';  /* carácter de finalización del string*/

    /* Mostrar resultados */
    printf("String resultante (str2): %s\n", str2);
    printf("Longitud del string es %d\n",i);
    printf("Primer carácter: %c\n", str2[0]);
    printf("Último carácter imprimible: %c\n", str2[i-1]);
    printf("Ultimo carácter real (\\0): 0x%02X\n", (unsigned char) str2[i]);

    /*
       Mostrar punteros (opcional). En C los identificadores de los arrays
       se tratan como un puntero char *
     */
    printf("\nDirecciones (ptr hex): str1 = %p, str2 = %p\n", str1, str2);
}

/*
 * Concatenar MANUALMENTE un string str1 con otro string str2
 * En este caso se lee la entrada con fgets (consultar: man 3 fgets))
 * OJO: fgets() sí añade \0 al final
 * Se muestra comentada la solución con scanf
 * Resultado en str3
 * Declaración y definición
 * Completar el código que falta
 */

void catstr1 (void) {
    char str1[MAX+1], str2[MAX+1], str3[MAX+MAX+1];        /* OJO: esta declaración reserva memoria */
    int i, j = 0;

    for(i = 0; i<MAX; i++)    /* consejo: inicializar SIEMPRE los arrays (por si acaso) */
    {
        str1[i]=0;
        str2[i]=0;
        str3[i]=0;
    }

    printf("Teclear string1 (max 50 caracteres): ");
    /*
       Muy recomendable leer con fgets
       man 3 fgets. Automáticamente añade \0 despues de \n
     */
    fgets(str1, MAX+1, stdin);
    /*
       Solución con scanf:
       scanf("%[^\n]s", str1);
       setbuf(stdin,NULL);
     */

    printf("Teclear string2 (max 50 caracteres): ");
    /*
       Muy recomendable leer con fgets
       man 3 fgets. Automáticamente añade \0 despues de \n
     */
    fgets(str2, MAX+1, stdin);

    /*
         COMPLETAR CÓDIGO:
    */






    /*
       Mostrar resultados
    */
    printf("String resultante (str3): %s\n", str3); /* OJO al \n. El array str3 no lo incluye */
    printf("Longitud del string es %d\n",j);
    printf("Primer carácter: %c\n", str3[0]);
    printf("Último carácter imprimible: %c\n", str3[j-1]);
    printf("Ultimo carácter real (\\0): 0x%02X\n", (unsigned char) str3[j]);
}

/*
 * Declaración de main con paso de argumentos
 * Como todavía no se ha visto, ignorarlo
int main(int argc, char * argv[]) {
 */
int main(void) {

    /*
     * Copiar MANUALMENTE un string en otro string (OJO, ambos son arrays)
     */

    cpystr1();

    /*
     * Concatenar MANUALMENTE un string con otro string (OJO, ambos son arrays)
     */

    catstr1();

    /* IMPORTANTE: salir decentemente */
    exit(OK);
}

COMPILACIÓN

  • Compilar: gcc -c -o StringCv1.o StringCv1.c
  • Montar: gcc -o StringCv1 ./StringCv1.o

Info

Consultar el manual de gcc: man gcc (man info)