Ver Mensaje Individual
  #6 (permalink)  
Antiguo 02/10/2014, 05:25
Avatar de Profesor_Falken
Profesor_Falken
 
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 9 meses
Puntos: 182
Respuesta: Problemas con punteros a cadenas [C]

Buenas,

Si perdona, he explicado muy rapido despues de leer en diagonal.

La diferencia entre una cadena de char y un literal (constante de cadena) es simplemente esta:

//Literal
char *cadena = "AAA0000";
Crea:
cadena[0] = const char 'A'
cadena[1] = const char 'A'
cadena[2] = const char 'A'
cadena[3] = const char '0'
...

//Cadena de char
char cadena[] = "AAA0000";
Crea:
cadena[0] = char 'A'
cadena[1] = char 'A'
cadena[2] = char 'A'
cadena[3] = char '0'
...


Es decir, el primero crea un array de constantes de char.

Yo considero una buena practica utilizar siempre literales ya que al ser constantes se evita modificar la propia memoria y afectar a otras partes del programa y ademas no hay problemas de concurrencia. Son totalmente thread-safe. Si se quiere hacer modificaciones sobre ese literal basta con hacer una copia de la cadena que incluya las modificiones necesarias. Esa es la estrategia que se ha tomado para la implementacion de la clase String en Java, por ejemplo.

Eso si, lo que hay que hacer es que asegurarse siempre de que el error se produce en compilacion y no en ejecucion, por lo que deberia declararse siempre como:

const char *cadena = "AAA0000";

De esta forma al compilar detectara el error en el intento de modificacion y obligara a corregirlo.

Por ultimo, para que el codigo funcione, simplemente basta con hacer un pequeno cambio:

Código C:
Ver original
  1. char cadena[] = "AAA000";
  2.    char* aux;
  3.    printf("%s\n", cadena);
  4.    aux = strchr(cadena, '\0');
  5.    aux -= 3;
  6.    printf("%s\n", aux);
  7.    *aux = '\0';
  8.    aux -= 3;
  9.    printf("%s\n", aux);
  10.    return 0;


Una lectura interesante al respecto:
http://www.ecured.cu/index.php/Const...form%C3%A1tica)


Un saludo
__________________
If to err is human, then programmers are the most human of us