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

Problema con la longitud de la cadena

Estas en el tema de Problema con la longitud de la cadena en el foro de C/C++ en Foros del Web. Os expongo mi problema. He hecho esta pequeña beta y hay un par de cosas que no entiendo para nada: 1) Por qué cuando aumento ...
  #1 (permalink)  
Antiguo 02/06/2012, 09:01
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Problema con la longitud de la cadena

Os expongo mi problema. He hecho esta pequeña beta y hay un par de cosas que no entiendo para nada:
1) Por qué cuando aumento el tamaño de la cadena (ponte una parrafada de 1000 caracteres) no funciona la opción de codificar. Me direis que es por el fgets y por el tamaño de la matriz, pero no, cambiad ambos el 100 por un 1000... y aun así, a mi no me funciona. Me da el output una B.

2) ¿Cómo puedo hacer para que las 'ñ' se presenten bien sin ponerme a hacer una función exclusiva sólo para mostrar una 'ñ'?

3) ¿Y los espacios en blanco? Me gustaría que, al encriptar, se comiese todos los espacios en blanco, y al desencriptar, los pusiese. ¿Es posible?

Gracias :)

Código C:
Ver original
  1. /*Codificador de frases y/o palabras*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. /*Alfabeto para codificación por "Cesar"*/
  8. char *claro="abcdefghijklmnñopqrstuvwxyz,.?!";
  9. char *oculto ="DEFGHIJKLMNÑOPQRSTUVWXYZABC*-=&";
  10.  
  11. /*prototipos de funciones*/
  12. void codificar(char *frase);
  13. void decodificar(char *frase);
  14. void flush_stdin(void);
  15.  
  16. main()
  17. {
  18.     int m;
  19.     char frase[100];
  20.    
  21.     do{
  22.     system("clear");
  23.     puts("\t\tMENU\n");
  24.     puts("\t1.- Codificar una frase");
  25.     puts("\t2.- Decodificar una frase");
  26.     puts("\t3.- Definir el algoritmo de codificacion");
  27.     puts("\t4.- Salir");
  28.     printf("Opción: ");
  29.     scanf("%d", &m);
  30.     flush_stdin();
  31.    
  32.  
  33.     switch(m)
  34.     {
  35.     case 1:
  36.     printf("Introduzca una frase: ");
  37.     fgets(frase, 100, stdin);
  38.     codificar(frase);
  39.     printf("La frase codificada es: ");
  40.     puts(frase);
  41.     puts("\tPulse cualquier tecla para continuar...");
  42.     getchar();
  43.     break;
  44.  
  45.     case 2:
  46.     printf("Introduzca una frase codificada: ");
  47.     fgets(frase, 100, stdin);
  48.     decodificar(frase);
  49.     printf("La frase decodificada es: ");
  50.     puts(frase);
  51.     puts("\tPulse cualquier tecla para continuar...");
  52.     getchar();
  53.     break;
  54.  
  55.     case 3:
  56.     system("clear");
  57.     puts("Que algoritmo desea utilizar?");
  58.     puts("1.- Codigo de Caesar con 3 desplazamientos");
  59.     puts("2.- [No disponible]");
  60.     printf("Opción: ");
  61.     scanf("%d", &m);
  62.     flush_stdin();
  63.    
  64.     case 4:
  65.     break;
  66.    
  67.     default:
  68.     puts("\tNo ha seleccionado ninguna opción del menu");
  69.     }
  70.     system("clear");}
  71.     while(m != 4);
  72. }
  73.  
  74. void codificar(char *frase)
  75. {
  76.     int i,j;
  77.     for(j=0;j<strlen(frase);j++)
  78.     {
  79.       for(i=0;i<strlen(claro);i++)
  80.       {
  81.          if(*(frase+j)==*(claro+i))
  82.          {
  83.          *(frase+j)=*(oculto+i);
  84.          }
  85.       }
  86.     }
  87. }
  88.  
  89.  
  90. void decodificar(char *frase)
  91. {
  92.     int i,j;
  93.     for(j=0;j<strlen(frase);j++)
  94.     {
  95.       for(i=0;i<strlen(claro);i++)
  96.       {
  97.          if((*(frase+j))==*(oculto+i))
  98.          {
  99.          *(frase+j)=*(claro+i);
  100.          }
  101.       }
  102.     }
  103. }
  104.  
  105. void flush_stdin(void)
  106. {
  107.    int ch;
  108.    while( (ch = getchar()) != '\n' && ch != EOF );
  109. }
  #2 (permalink)  
Antiguo 02/06/2012, 14:24
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema con la longitud de la cadena

Bueno, he hecho avances, pero sigo necesitando ayuda.

Para comerme los espacios en blanco he usado:

Código C:
Ver original
  1. char *tmp;
  2. char texto[] = "hola foros del web";
  3.  
  4. while((tmp=strchr(texto,' '))!=NULL)
  5.     strcpy(tmp,tmp+1);

El caso es que ahora me ha surgido otro problema, y llevo luchando con el al menos dos horas. Estoy intentando convertir un carácter a un número. He diseñado la siguiente función:

Código C:
Ver original
  1. int *tonumber(char *cadena)
  2. {
  3.   char letras[] = "ABCDFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  4.   int numeros[100], cadenafinal[100], i, j;
  5.  
  6.   for(i=0; i<25;i++) numeros[i] = i;
  7.   for(i=25; i<50;i++) numeros[i] = (i-25);
  8.  
  9.   for(i=0; i<strlen(cadena); i++){
  10.      for(j=0; j<strlen(letras); j++){
  11.          if(cadena[i] == letras[j]) cadenafinal[i] = numeros[j];}}
  12.  
  13.   return *cadenafinal;
  14.  
  15. }

El problema es que posteriormente, en el uso no salen resultados. No sé si es por que estoy usando mal los punteros (al retornar un int *) o si se me escapa cualquier otra cosa.

Código C:
Ver original
  1. main()
  2. {
  3. int q[100];
  4. char *clave = "cadenadecaracteres"
  5.  
  6. q = tonumber(clave); // Convierto cada caracter a número
  7.  
  8. while(q[i] != '\0'){printf("-%d-", q[i]); i++;} // Imprimo los caracteres convertidos a números
  9. }

Agradecería verdaderamente ayuda cuanto antes. Llevo más de la mitad del programa diseñado. Diseñé un buen algoritmo de encriptación y más o menos no va mal, el problema es este.
  #3 (permalink)  
Antiguo 02/06/2012, 16:14
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Problema con la longitud de la cadena

Hola! Para el primer post:
1) probe cambiando de 100 a 1000 y no tengo problemas
2) La ñ casi ni se usa, ni penses para eso :P
3) a q te referis con comer los espacios??? Supongamos que encriptas "cesar casla", y como resultado da: "aeiou abcde"; ¿¿lo q vos qres es comer espacios asi: "aeiouabcde" ???
El tema es como despues sabes cuando va un espacio para desencriptar??

Para el segundo post: no entiendo muy bien q es lo hacer, pero te marco los errores para funcion tonumber():
Código C:
Ver original
  1. return *cadenafinal;
sino me equivoco estas retornando un int no un int*. Tendria que ser sin el * (raro q no te de aunq sea un warning)
2º Otro error es que cadenafinal es un arreglo declarado en la funcion, y cuando retornes al main cadenafinal ya no existe
3º Por lo q veo al arreglo "q" le queres asignar cadenafinal(q=cadenafinal) recorda que los arreglos tenes q copiar dato x dato

Para resolverlo: en el main "q" debe ser un int *, luego en la funcion creas un arreglo dinamico(con malloc) y retornas eso

Saludos
  #4 (permalink)  
Antiguo 02/06/2012, 17:35
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema con la longitud de la cadena

Te pego la parte del programa que sigue sin dejarme trabajar.

Ahora mismo, al compilar, la funcion tonumber me da un warning con respecto a lo que retorno... pero lo he remirado y no parece tener ningún fallo, y luego las sentencias que sí me dan más dolor son estas:
Código C:
Ver original
  1. (int *)claveaux = tonumber(claveaux); //Convierte los caracteres de clave en valores numéricos
  2.  
  3.   (int *)texto = tonumber(texto);        //Convierte los caracteres de texto en valores numéricos

No están bien, pero no sé cómo se ha de hacer pues :(

Aquú el código:

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

A ver si ves tu la luz y me puedes iluminar un poquitín el camino...

PD: He ido comentando cada paso para que se entienda lo que quiero hacer.
  #5 (permalink)  
Antiguo 02/06/2012, 18:04
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con la longitud de la cadena

Una pregunta la funcion tonumber que deberia hacer?? transformar una cadena a int??

Reservas memoria para un solo entero:
cadenafinal = (int *)malloc(sizeof(int));

Y despues lo usas como si tuvieses un array:
*(cadenafinal + i) = numeros[j];}}
  #6 (permalink)  
Antiguo 02/06/2012, 19:08
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 10 meses
Puntos: 94
Respuesta: Problema con la longitud de la cadena

Ademas de lo q dijo sam90, no leiste ninguna de las observaciones q te hice:
Código C:
Ver original
  1. return *cadenafinal;
tiene q ser
Código C:
Ver original
  1. return cadenafinal;

No podes hacer esto:
Código C:
Ver original
  1. (int *)claveaux = tonumber(claveaux); //Convierte los caracteres de clave en valores numéricos
  2.     (int *)texto = tonumber(texto);
claveaux y texto son arreglos de caracteres, y tonumber() devuelve un int *. Pero el error principal es que vos estas queriendo hacer una asignacion entre arreglos lo cual no se puede. En lugar de claveaux y texto deben ir los punteros "p" y "q"

Saludos
  #7 (permalink)  
Antiguo 04/06/2012, 07:31
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 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. }
  #8 (permalink)  
Antiguo 04/06/2012, 11:35
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con la longitud de la cadena

Que deberia hacer la funcion tonumber. Si no me dices no te puedo guiar.
  #9 (permalink)  
Antiguo 04/06/2012, 11:58
 
Fecha de Ingreso: diciembre-2008
Mensajes: 50
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Problema con la longitud de la cadena

Cita:
Iniciado por sam90 Ver Mensaje
Que deberia hacer la funcion tonumber. Si no me dices no te puedo guiar.
Muy sencillo, dada una cadena de caracteres, por ejemplo, "mamamevoyacomer", asocia cada caracter a un entero.

En la función, si te fijas, hay dos arrays, uno con el alfabeto, de la A a la z, pasando por todas las mayusculas y minusculas, y otro con los numeros, del 1 al 25 dos veces. Con esto pretendo asociar, a cada letra, un número. Es decir, la A y la a es un 0, la B y la b un 1, la C y la c un dos, y así consecutivamente.

De esta manera, cuando la función lee en la cadena introducida(char cadena), por ejemplo, una A, mete en la cadena asociada (int cadenafinal) un 0, y cuando ve una Z, mete un 25.

¿Cuál es el fin de esto? Codificar una frase con números,

Ejemplo:

Cadena introducida: aabzy
Cadena final: 0 0 1 25 24

¿Sí? El algoritmo lo he diseñado yo jajaja
  #10 (permalink)  
Antiguo 04/06/2012, 12:09
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Problema con la longitud de la cadena

Es mas facil usar el hecho de que los char son numeros.

Código C:
Ver original
  1. int *tonumber(char *cadena) /*Versión con punteros*/
  2. {
  3.   int i, j;
  4.  
  5.   int  * cadenafinal = malloc (strlen(cadena) *  sizeof(int));
  6.  
  7.   for(i=0; i<strlen(cadena); i++) {
  8.          if ( 'a' <= cadena[i] && cadena[i] <= 'z' )  cadenafinal[i] = cadena[i] - 'a' ;
  9.          else if ( 'A' <= cadena[i] && cadena[i] <= 'Z' ) cadenafinal[i] = cadena[i] - 'A' ;
  10.   }
  11.   return cadenafinal;
  12. }


Código C:
Ver original
  1. char * cadena = "HolaMan";
  2. int * c = tonumber(cadena);
  #11 (permalink)  
Antiguo 04/06/2012, 12:24
Avatar de neysitc  
Fecha de Ingreso: noviembre-2010
Ubicación: alert('Peru')
Mensajes: 47
Antigüedad: 14 años
Puntos: 5
Respuesta: Problema con la longitud de la cadena

Si deseas convertir caracteres a numeros, o una cadena completa a numeros, puedes hacerlo de forma sencilla de la siguiente manera:


Código C++:
Ver original
  1. int caracterToNumber(char car)
  2. {
  3.     return  int(car);
  4. }
  5.  
  6.  
  7. char* stringToNumber(char* cad){
  8.     char *salida;
  9.     salida[0] = NULL;
  10.     for(int i=0;i<strlen(cad); i++)
  11.         {
  12.             int n;char t[1]; t[0]=NULL;
  13.             n = caracterToNumber(cad[i]);
  14.             sprintf(t,"%d",n);
  15.             strcat(salida,t);
  16.         }
  17.  
  18.     return salida;
  19. }
  20.  
  21. //USO
  22.  
  23. char *msj ="hola mundo";
  24.  
  25. cout<<stringToNumber(msj)<<endl;

Etiquetas: funcion, int, longitud, string, cadenas
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 06:16.