Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: HijoDePuta en 5 Agosto 2013, 11:14 am



Título: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: HijoDePuta en 5 Agosto 2013, 11:14 am
Buenas,

Entenderéis esto mejor si os pongo el enunciado de un problema que me causa esta duda:

Citar
Escribe un programa que, dada una secuencia de caracteres terminada en un punto, nos devuelva la posición en la tabla ASCII asociada a cada uno de los caracteres leídos.
Posteriormente y antes de finalizar mostraremos por pantalla el número total de caracteres
leídos.

Mi primera duda es que no comprendo a qué se refiere con secuencia, si a una palabra (como "cosa") o si a una serie de caracteres ("c" - "o" - "s"...).

En cualquier caso, mi problema es que yo no sé de antemano cuantos caracteres va a tener la palabra, si 3, 6 o 1200. Por tanto no sé cuantas variables char tengo que crear.

¿Existe alguna manera de leer un número indefinido de caracteres y trabajar con ellos?


Gracias de antemano y saludos.


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: flony en 6 Agosto 2013, 13:04 pm
secuencia de caracteres
Citar
holacomoestas
eso es una secuencia de caracteres...o sea un conjunto de letras que puede ser o no una palabra.
Podes trabajar con vectores(pero tienen limite, la idea seria meterle un vector grande )
podrías usar la libreria string...si es que estas en C++


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: eferion en 6 Agosto 2013, 13:20 pm
Mi primera duda es que no comprendo a qué se refiere con secuencia, si a una palabra (como "cosa") o si a una serie de caracteres ("c" - "o" - "s"...).

Una secuencia es que el usuario escriba en pantalla, por ejemplo, "abcdf hola como estas no se que poner".

En c tienes varias opciones:

* Puedes proponerte crear un vector lo suficientemente grande como para que sea dificil llenarlo... 1000 caracteres por ejemplo.

* Una opción más elegante sería implementar una función que permitiese incrementar el tamaño del buffer de forma dinámica según se llene... para hacer esto tendría que crear un nuevo buffer de un tamaño superior al actual, copiar los datos del buffer viejo al nuevo y liberar la memoria del viejo buffer.

En c++, utilizando las clases stream no deberías tener problemas por overflow, ya que estas clases ya incorporan sus propios mecanismos de protección.


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: amchacon en 6 Agosto 2013, 13:23 pm
String:
http://www.cplusplus.com/reference/string/string/

Código
  1. string Texto = "Una cadena de caracteres";
  2.  
  3. Texto += " relleno";
  4. Texto += " mas relleno";
  5.  
  6. cout<<Texto;
  7. cout<<Texto.size(); // Tamanyo de la cadena


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: HijoDePuta en 7 Agosto 2013, 11:30 am
Muchas gracias lo pondré en práctica a ver que tal ^^


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: MeCraniDOS en 8 Agosto 2013, 10:15 am
Quizás te puede servir este código

Código
  1. #include <stdio.h>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    int Ascii;
  9.    int Longitud;
  10.    int n;
  11.    int Contador = 0;
  12.  
  13.    printf("Cuanto ocupara su cadena? (El punto se pone automaticamente): ");
  14.    cin >> Longitud;
  15.  
  16.    char *Long_Cadena = new char [Longitud + 1];
  17.  
  18.    printf("\nEscriba %d caracteres seguidos: ", Longitud);
  19.    fflush(stdin);
  20.    fgets(Long_Cadena, Longitud + 1, stdin);
  21.  
  22.    printf("\nSu cadena con %d caracteres es: ", Longitud);
  23.    cout << Long_Cadena << "." << "\n";
  24.  
  25.    for(n=0; n<=Longitud - 1; n++)
  26.        {
  27.            printf("\nCaracter = %c - Tabla Ascii = %d - Valor Hex = %x", Long_Cadena[n], Long_Cadena[n], Long_Cadena[n]);
  28.            fflush(stdin);
  29.            Contador++;
  30.  
  31.        }
  32.  
  33.    delete[] Long_Cadena;
  34.    cout << "\n\nCaracteres Leidos: " << Contador << "\n";
  35.    cout << "\nPresiona Intro para fianlizar...\n";
  36.    fflush(stdin);
  37.    getchar();
  38. }

Saludos :silbar:


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: do-while en 8 Agosto 2013, 10:36 am
¡Buenas!

Lo único que te pide es saber cual es el ASCII y las repeticiones de los caracteres introducidos hasta el primer punto.

No te hace falta para nada saber cuantos caracteres tienes que leer:
Código
  1.    char lector[11];
  2.    char repeticiones[256];
  3.    int i;
  4.  
  5.    memset(repeticiones,0,256);
  6.  
  7.    do{
  8.        fgets(lector,10,stdin);
  9.  
  10.        for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
  11.            repeticiones[lector[i]]++;
  12.  
  13.    }while(!strchr(lector,'.'));
  14.  
  15.    for(i = 0 ; i < 256 ; i++)
  16.    {
  17.        if(repeticiones[i])
  18.            printf("%c: %d repeticiones\n",i,repeticiones[i]);
  19.    }
  20.  

Pues no, te pide la posición en la tabla ASCII de los caracteres y el numero de caracteres. El código queda así:
Código
  1.    char lector[11];
  2.    char repeticiones[256];
  3.    int i,total = 0;
  4.  
  5.    memset(repeticiones,0,256);
  6.  
  7.    do{
  8.        fgets(lector,10,stdin);
  9.  
  10.        for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
  11.            repeticiones[lector[i]]++;
  12.  
  13.    }while(!strchr(lector,'.'));
  14.  
  15.    for(i = 0 ; i < 256 ; i++)
  16.    {
  17.        if(repeticiones[i])
  18.            printf("%c: ASCII %d\n",i,i);
  19.        total += repeticiones[i];
  20.    }
  21.  
  22.    printf("%d caracteres\n",total);
  23.  

¡Saludos!


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: rir3760 en 8 Agosto 2013, 17:35 pm
Pues no, te pide la posición en la tabla ASCII de los caracteres y el numero de caracteres. El código queda así:
Código
  1. char lector[11];
  2. char repeticiones[256];
  3. int i,total = 0;
  4.  
  5. memset(repeticiones,0,256);
  6.  
  7. do{
  8.  fgets(lector,10,stdin);
  9.  
  10.  for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
  11.      repeticiones[lector[i]]++;
  12.  
  13. }while(!strchr(lector,'.'));
  14.  
  15. for(i = 0 ; i < 256 ; i++)
  16. {
  17.  if(repeticiones[i])
  18.      printf("%c: ASCII %d\n",i,i);
  19.  total += repeticiones[i];
  20. }
  21.  
  22. printf("%d caracteres\n",total);
  23.  
En el bucle do ... while no es necesario llamar a strchr ya que el bucle interno terminara cuando el carácter "lector[ i ]" sea igual a '\0', '\n' o '.'. Por ello basta con una comparación:
Código
  1. char lector[11];
  2. char repeticiones[256] = {0};
  3. int i,total = 0;
  4.  
  5. do {
  6.  fgets(lector,10,stdin);
  7.  
  8.  for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
  9.      repeticiones[lector[i]]++;
  10.  
  11. }while (lector[i] != '.');

Y revisando con cuidado el enunciado me parece que no es necesario imprimir la frecuencia de cada carácter, en base a ello se pueden eliminar los arrays.

Un saludo


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: MeCraniDOS en 8 Agosto 2013, 22:24 pm
El código lo tenia hecho y modifique algo para que tuviera una idea de por donde empezar :)


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: HijoDePuta en 9 Agosto 2013, 13:10 pm
Hola :)


Muchas gracias a todos, he conseguido lo que pretendía y sin vuestra ayuda no habría podido :P Al final he comprendido como hacerlo sin vectores (no los necesitaba ahí) y ya sé actuar con las secuencias con arrays, me habéis abierto los ojos :D

Editado: Tenía un tochopost para nada, mi  nueva duda era tonta, por eso edito :S


Título: Re: [C++] ¿Cómo consigo leer un número indefinido de caracteres?
Publicado por: za.asi en 9 Agosto 2013, 13:17 pm
esto es porque estas usando enteros y no vectores. Tendrías que declarar un vector de enteros y guardar el 1 en la primera posición, el 2 en la segunda... y luego podrías simplemente trabajar con ese vector que has formado para hacer lo que te pide el ejercicio o hacer un bucle que lo vaya haciendo a medida que vas llenando el vector.