Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problemas con punteros a cadenas [C]

Estas en el tema de Problemas con punteros a cadenas [C] en el foro de C/C++ en Foros del Web. Hola!! Alguien me podría orientar y decirme porque el programa deja de funcionar cuando tiene que hacer la asignación *aux = '\0' El programa simplemente ...
  #1 (permalink)  
Antiguo 30/09/2014, 16:58
 
Fecha de Ingreso: junio-2010
Mensajes: 9
Antigüedad: 13 años, 10 meses
Puntos: 0
Problemas con punteros a cadenas [C]

Hola!!

Alguien me podría orientar y decirme porque el programa deja de funcionar cuando tiene que hacer la asignación *aux = '\0'

El programa simplemente me muestra (o deberia mostrar) la cadena "AAA000" separada en "000" y "AAA".

Código:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *cadena = (char *)"AAA000";
   char *aux;
   printf("%s\n", cadena);
   aux = strchr(cadena, '\0');
   aux -= 3;
   printf("%s\n", aux);
   *aux = '\0';
   aux -= 3;
   printf("%s\n", aux);
   return 0;
}
  #2 (permalink)  
Antiguo 30/09/2014, 20:12
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

creo... que es por que "AAA000" es una constante literal. No la debes modificar.
Esta desaconsejado el uso de literales. En ves de eso usa los arrays que para eso están.

Ademas el carácter NULL ('\0') sirve para decir donde esta el fin de una cadena y no se si en las literales soporta dicho caracter. en La pagina de zator lo esplica algo sobre eso(ver mas abajo).

A decir la verdad veo eso un disparate pero ni seria capaz de decirte el por que exactamente ya que son muchos "por ques" lo que veo.

Solo te puedo encaminar a un lugar que contiene una serie de reglas a las que debes seguir si no quieres estamparte en el tema ya que es un poco raro. XDDD

http://www.zator.com/Cpp/E3_2_3f.htm
http://www.c.conclase.net/curso/?cap=012c


Y a ver si algún fiera nos aclara eso ya que ahora somos 2 interesados jeje.
Suerte
  #3 (permalink)  
Antiguo 01/10/2014, 17:52
 
Fecha de Ingreso: junio-2010
Mensajes: 9
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problemas con punteros a cadenas [C]

Ok tomo nota y pruebo con arrays.

Gracias por las páginas me resolvieron algunas dudas que tenia.

Saludos!
  #4 (permalink)  
Antiguo 02/10/2014, 01:18
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problemas con punteros a cadenas [C]

Buenas,

Como dice vangodp el literal es una constante y dicha seccion de memoria no se puede modificar.

Cada vez que se hace una operacion qua modifique un "string" lo que se hace es crear una copia de la cadena que incluya la modificacion.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #5 (permalink)  
Antiguo 02/10/2014, 04:24
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

Cita:
Iniciado por Profesor_Falken Ver Mensaje
Cada vez que se hace una operacion qua modifique un "string" lo que se hace es crear una copia de la cadena que incluya la modificacion.
¿Eso que dices... son con los literales o con las cadenas de chars?
  #6 (permalink)  
Antiguo 02/10/2014, 05:25
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 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
  #7 (permalink)  
Antiguo 02/10/2014, 06:50
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

perfecto... buen dato.
Gracias :)
  #8 (permalink)  
Antiguo 02/10/2014, 08:57
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problemas con punteros a cadenas [C]

Ups. Acabo de ver que el articulo que he puesto es el mismo que habias puesto tu pero con otra url
__________________
If to err is human, then programmers are the most human of us
  #9 (permalink)  
Antiguo 02/10/2014, 11:56
 
Fecha de Ingreso: junio-2010
Mensajes: 9
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Problemas con punteros a cadenas [C]

Gracias por la ayuda a ambos!

Muy completa la respuesta.

Saludos!
  #10 (permalink)  
Antiguo 02/10/2014, 17:09
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

Un punto a destacar es que en c++ con el compilador g++ si hago: char *P = (char*)"hola mundo!";

Se lo traga muy bien... pero si hago: char *P = "hola mundo!";
...me tira un aviso diciendo que esta deprecated, o sea desaconsejado el uso de eso.
Para eso hay que tener el -warningall activado.

No es un error pero si dicen que no usemos eso de la segunda forma. Seguro es una de esas cosas que solo las mantienen por retrocompatibilidad, lo que no entiendo es que de la primera forma no chilla XDD.

Realmente no se a que se debe. ¿Alguien sabe algo?
  #11 (permalink)  
Antiguo 03/10/2014, 00:36
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problemas con punteros a cadenas [C]

Buenas vangodp,

Exacto. Pero no es el uso de literales el que esta deprecado, sino la asignacion de un puntero char no constante.

Si pones const char* P = "hola mundo!" veras que no se produce ningun tipo de warning.

Lo que se trata de evitar precisamente es lo que comentaba, que se produzcan errores en runtime al intentar modificar los elementos, que en realidad son const char. Estos errores tienes que producirse siempre en compilacion y nunca en ejecucion.

http://stackoverflow.com/questions/1...-is-deprecated


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #12 (permalink)  
Antiguo 03/10/2014, 01:03
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

perfecto profesor :)
La cosa es tener claro que son constantes y no se debe modificar. Pero siempre es bueno saber bien el por que, ya que así te queda mas claro.

Y una cosa mas ya que estamos.
realmente que diferencia hay de:
char *P = (char*)"hola mundo!";
a
char *P = "hola mundo!";

debería chillar de ambas formas. ¿En el caso del (char*)"hola mundo!" es por que le hago una convercion? Realmente no entiendo la diferencia.
Bendito mundo de los punteros jejeje

Muchas gracias ^^
  #13 (permalink)  
Antiguo 03/10/2014, 03:25
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problemas con punteros a cadenas [C]

Cita:
Iniciado por vangodp Ver Mensaje
perfecto profesor :)
debería chillar de ambas formas. ¿En el caso del (char*)"hola mundo!" es por que le hago una convercion? Realmente no entiendo la diferencia.
Efectivamente, (char*) es un cast explícito y lo que tiene C es que asume que sabes lo que estás haciendo y no se preocupa de si la conversión es válida o no... en este caso, la variable que has creado es de tipo char* y recibe un char* (realmente es un const char*, pero el const "desaparece" al hacer la conversión), por lo que el compilador no se queja... hasta que te da por intentar modificar el contenido de esa cadena.
  #14 (permalink)  
Antiguo 03/10/2014, 03:36
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

¡hombre que gustazo verte por aquí! =)
Gracias por la explicación jejej
Pues mira ... entre profesor falken y eferion ya se algo mas de punteros y constantes literales =)
Era un temilla algo complicado jajaj, sobro todo para los novatos como yo. XDD
Saludos y que tengan un buen día.
  #15 (permalink)  
Antiguo 03/10/2014, 03:55
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problemas con punteros a cadenas [C]

Igualmente, da gusto ver caras conocidas :)

y tu de novato me da que ya tienes poco... no te subestimes.
  #16 (permalink)  
Antiguo 03/10/2014, 08:00
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Problemas con punteros a cadenas [C]

Buenas,

Como ya ha dicho eferion, como has hecho el casting previeamente, el compilador al validar solo ve que se asigna un char* a un char* y no se da cuenta de que lo que realmente se asigna es un literal.

Esto enmascara el warning, pero no elimina la peligrosidad de la asignacion. En mi caso, al ejecutar el programa, es el propio sistema operativo el que captura la senal y me muestra una ventana de error...

Yo de Java y otros lenguajes si que tengo muuucha experiencia, pero de C se mucho menos que tu, vangodp. Para mi el uso de C es solo un hobby, asi que tambien aprendo mucho de tus aportaciones


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #17 (permalink)  
Antiguo 03/10/2014, 08:49
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

Es que mi maestro es eferion, el si que es un maquina. Cuando sea mayor quiero ser como el.XD
Para ser tu hobby no veas como afinas. jeje
Suerte :3

PS:
Un día me vas a enseñar Java. XDD
  #18 (permalink)  
Antiguo 03/10/2014, 09:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Problemas con punteros a cadenas [C]

Jajajaja si fuese tan bueno las empresas se pegarían por mi jejeje....

Bueno, ya en serio, tampoco creo me considero un gurú de C++... lo que sucede es que lo uso en mi día a día y eso a veces se nota

Aún así se agradece el cumplido :)

Un saludo.
  #19 (permalink)  
Antiguo 03/10/2014, 18:53
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problemas con punteros a cadenas [C]

Bueno.. espero que te pase por aquí a menudo compañero. Seria genial tenerte por aquí ya que en otros lados nos tienen muy capados. ¿Sabes a que me refiero verdad?
Al fin y al cabo estamos todos a lo mismo... aprender.
Por ese par de mensajes de mas ya nos hubiese llegado el señor candados a chaflarnos el buen rollo.

Etiquetas: cadenas, punteros
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:27.