Ver Mensaje Individual
  #7 (permalink)  
Antiguo 04/06/2012, 07:31
Javieer-G
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 4 meses
Puntos: 0
Respuesta: Problema con la longitud de la cadena

Ok... creo que voy entendiendo. Con respecto a lo que dices, Sam, uso ahora calloc, y a lo que dices tú, cesar, ya cambié eso. Sin embargo, declarando texto_num y clave_num como punteros me evita tener que usar p y q, no?

Ahora mismo ya he conseguido que compile sin problema alguno, pero me da una violación de segmento. No sé muy bien por qué.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. int *tonumber(char *cadena,  int *cadenafinal) /*Versión con punteros*/
  6. {
  7.   char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  8.   int numeros[100], i, j;
  9.  
  10.   cadenafinal = calloc(strlen(cadena), sizeof(int));
  11.  
  12.   for(i=0; i<25;i++) numeros[i] = i;
  13.   for(i=25; i<50;i++) numeros[i] = (i-25);
  14.  
  15.   for(i=0; i<strlen(cadena); i++){
  16.      for(j=0; j<strlen(letras); j++){
  17.          if(cadena[i] == letras[j])
  18.             *(cadenafinal + i) = numeros[j];}}
  19.  
  20.   return cadenafinal;
  21. }
  22.  
  23. main()
  24. {
  25.   char *tmp;
  26.   int i, cifrado[100], *texto_num=NULL, *clave_num= NULL;
  27.   char texto[100] = "hola foro solo codigo", clave[100] = "clave", claveaux[100] = "\0";
  28.  
  29.   while((tmp=strchr(texto,' '))!=NULL) //Quita los espacios en blanco al texto
  30.     strcpy(tmp,tmp+1);
  31.  
  32.   while(strlen(clave)<strlen(texto))   //copia la clave a continuación de la misma mientras
  33.     strcat(clave, clave);              //que su longitud sea menor que la del texto.
  34.  
  35.   while((tmp=strchr(clave,' '))!=NULL) //Quita los espacios en blanco a la clave
  36.     strcpy(tmp,tmp+1);
  37.  
  38.   strncpy(claveaux, clave, strlen(texto));  //Elimina caracteres a la clave hasta que esta sea del
  39.                                             //tamaño del texto.
  40.  
  41.   clave_num = tonumber(claveaux, clave_num); //Convierte los caracteres de clave en valores numéricos
  42.  
  43.   texto_num = tonumber(texto, texto_num);        //Convierte los caracteres de texto en valores numéricos
  44.    
  45.  
  46.   while(*(texto_num+i) != '\0'){                //Suma al valor ASCII del caracter correspondiente del
  47.     cifrado[i] = *(texto_num+i) + *(clave_num+i);  //texto al valor ASCII del caracter de la clave.
  48.     i++;}
  49.  
  50.   while(cifrado[i] != '\0'){printf("-%d-", cifrado[i]); i++;}
  51.  
  52.   free(clave_num); free(texto_num);
  53.  
  54. }