Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: W0lFy en 20 Octubre 2010, 20:49 pm



Título: Fallo de segmentación
Publicado por: W0lFy en 20 Octubre 2010, 20:49 pm
Quisiera cambiar un caracter en una cadena de caracteres, y me da fallo de segmentación. ¿ que ocurre?

char *cadena="Cliente: ";
cadena=cadena+sizeof((char)*2);
*cadena='a';
printf("caracter %c, *cadena);

................-> fallo de segmentación.


Que ocurre? como se puede cambiar en C un caracter de una cadena de longitud dinamica? Un saludo


Título: Re: Fallo de segmentación
Publicado por: ace332 en 20 Octubre 2010, 21:10 pm
Hola
Respondiendo a tu pregunta, la cadena "Cliente:" C la ubica en un lugar de la memoria que no puede ser modificada en tiempo de ejecución. Si deseas modificar la cadena debes definirla como un arreglo de chars:

Código
  1. char cadena[]="Cliente:";
  2.  

Ahora, quieres hacer "cadenas de longitud dinámicas" mmmmm...

Los strings en C son cadenas de caracteres terminados con un 0. Osea que puedes agregar o quitar caracteres a la cadena desplazando ese cero...

Te recomiendo darle una revisada a la biblioteca string.h

En fin, espero haber ayudado un poco

Saludos.


Título: Re: Fallo de segmentación
Publicado por: W0lFy en 21 Octubre 2010, 01:09 am
veamos el codigo:



Código
  1.  
  2.  
  3. #include <pthread.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <string.h>
  8.  
  9. struct tcola
  10. {
  11.  char trabajo[80];
  12.  struct tcola *sig;
  13. };
  14. void crear(struct tcola **cola)
  15. {
  16.  *cola = NULL;
  17. }
  18.  
  19. int vacia(struct tcola *cola)
  20. {
  21.  return (cola == NULL);
  22. }
  23. void encolar(struct tcola **cola, char elem[80])
  24. {
  25.  struct tcola *nuevo;
  26.  
  27.  nuevo = (struct tcola *) malloc(sizeof(struct tcola));
  28.  nuevo->clave=elem;
  29.  
  30.  if (*cola == NULL)
  31.  nuevo->sig = nuevo;
  32.  else {
  33.    nuevo->sig = (*cola)->sig;
  34.    (*cola)->sig = nuevo;
  35.  }
  36.  (*cola) = nuevo;
  37. }
  38. void desencolar(struct tcola **c1,char elem[])
  39. {
  40.  struct tcola *aux;
  41.  elem= (c1*)->sig->clave;
  42. if ((*c1) == (*c1)->sig)
  43. {
  44.    free(*c1);
  45.    *c1 = NULL;
  46.  }
  47. else
  48. {
  49.   aux=(*c1);
  50.   (*c1)= aux->sig;
  51. free(aux);
  52. }
  53. printf("en desencolar %s\n",elem);
  54. }
  55.  
  56. void cliente(int indiceCliente)
  57. {
  58.    char cadena[]="hola que tal";
  59.    cadena[2]='b';
  60.    encolar(&cola,cadena);
  61. }
  62. int main(void)
  63. {
  64.  
  65.    char *cad;
  66.    crear(&cola);
  67.    cliente(3);// la cola es una variable global
  68.    desencolar(&cola,&cad);
  69.    printf("%s\n",cad);
  70. }
Bueno pos la salida de main me devuelve por un lado
"en desencolar hoba que tal" ( esto es el primer string que uso como banderita)
aqui una cadena de "basura". como si no modificara el valor de la cadena, mi problema es que no se como devolver la cadena de caracteres en el procedimiento desencolar. No se pasarlo bien por referencia... Alguien me ayuda?¿