Author Topic: Cambiar 'a' por 'A' en string ... (para romper el hielo)  (Read 1839 times)

yoel

  • Newbie
  • *
  • Posts: 7
  • Karma: 0
    • View Profile
Cambiar 'a' por 'A' en string ... (para romper el hielo)
« on: Febrero 05, 2014, 07:08:21 am »
Hola a todos. Soy nuevo en el foro y últimamente he visto poca actividad en el mismo (en el área C++/Linux), la gente no quiere preguntar jeje  ::)

Así que decidí poner unos aportes propios a manera de romper el hielo. Algunas mini-cosillas fruto de la experiencia personal, y quizá en el futuro algunas no tan mini ...

En esta ocasión voy a presentar algo bien simple, supónganse que queremos cambiar todas las apariciones del carácter 'a' en una cadena por 'A'. Haríamos algo como:

Code: [Select]
int i, N;
char s[100];

/* aquí un código para rellenar la cadena, algo con gets, scanf, etc
    .... */   

/* luego hacemos el cambio */
N = strlen( s );
for ( i = 0; i < N; i++ ) {
    if ( s[i] == 'a' ) s[i] = 'A';
}

Pues bien, en realidad tenemos un pequeño desperdicio en tiempo de ejecución. Porque la función strlen probablemente recorre una vez toda la cadena para detectar el carácter nulo de terminación y así calcular la longitud de la cadena. Luego la recorremos otra vez con el for.

Sería mejor con:

Code: [Select]
int i, N;
char c;
char s[100];

/* aquí un código para rellenar la cadena, algo con gets, scanf, etc
    .... */   

/* luego hacemos el cambio */
for ( i = 0; (c = s[i]) != '\0'; i++ ) {
    if ( c == 'a' ) s[i] = 'A';
}

lo que nos evita el strlen. Simplemente detectamos nosotros mismos el fin de cadena usando el propio for. ¿Pero qué pasa si la cadena es más larga de lo que permite el tipo int provocando el "desbordamiento" del contador. Ahí podríamos tener un comportamiento inesperado, lo que todo programador responsable debería evitar. Por eso sería bueno cargar la biblioteca estándar <limits.h> y reforzar nuestro ciclo como:

Code: [Select]
#include <limits.h>

/* aquí etc, etc */

int i, N;
char c;
char s[100];

/* aquí un código para rellenar la cadena, algo con gets, scanf, etc
    .... */   

/* luego hacemos el cambio */
for ( i = 0; i < INT_MAX && (c = s[i]) != '\0'; i++ ) {
    if ( c == 'a' ) s[i] = 'A';
}
lo que previene el desbordamiento.

Espero los haya entretenido un rato, espero las réplicas y/o aportes de otro, así mismo espero en un futuro contribuir con algo más complejo jeje.

Por cierto, ¿alguien sabe cómo insertar tabuladores dentro del <code> para hacer las sangrías automáticamente en los mensajes?
Yoel
« Last Edit: Febrero 05, 2014, 07:14:08 am by yoel »

 

ey