[C++] ¿Cómo consigo leer un número indefinido de caracteres?

Iniciado por HijoDePuta, 5 Agosto 2013, 11:14 AM

0 Miembros y 1 Visitante están viendo este tema.

HijoDePuta

Buenas,

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

CitarEscribe 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.

flony

secuencia de caracteres
Citarholacomoestas
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++
si un problema no tiene solucion entonces no es un problema...es algo inevitable

eferion

Cita de: HijoDePuta en  5 Agosto 2013, 11:14 AM
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.

amchacon

String:
http://www.cplusplus.com/reference/string/string/

Código (cpp) [Seleccionar]
string Texto = "Una cadena de caracteres";

Texto += " relleno";
Texto += " mas relleno";

cout<<Texto;
cout<<Texto.size(); // Tamanyo de la cadena
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

HijoDePuta

Muchas gracias lo pondré en práctica a ver que tal ^^

MeCraniDOS

Quizás te puede servir este código

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <iostream>

using namespace std;

int main()
{
    int Ascii;
    int Longitud;
    int n;
    int Contador = 0;

    printf("Cuanto ocupara su cadena? (El punto se pone automaticamente): ");
    cin >> Longitud;

    char *Long_Cadena = new char [Longitud + 1];

    printf("\nEscriba %d caracteres seguidos: ", Longitud);
    fflush(stdin);
    fgets(Long_Cadena, Longitud + 1, stdin);

    printf("\nSu cadena con %d caracteres es: ", Longitud);
    cout << Long_Cadena << "." << "\n";

    for(n=0; n<=Longitud - 1; n++)
        {
            printf("\nCaracter = %c - Tabla Ascii = %d - Valor Hex = %x", Long_Cadena[n], Long_Cadena[n], Long_Cadena[n]);
            fflush(stdin);
            Contador++;

        }

    delete[] Long_Cadena;
    cout << "\n\nCaracteres Leidos: " << Contador << "\n";
    cout << "\nPresiona Intro para fianlizar...\n";
    fflush(stdin);
    getchar();
}


Saludos :silbar:
"La física es el sistema operativo del Universo"
     -- Steven R Garman

do-while

#6
¡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:

   char lector[11];
   char repeticiones[256];
   int i;

   memset(repeticiones,0,256);

   do{
       fgets(lector,10,stdin);

        for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
           repeticiones[lector[i]]++;

   }while(!strchr(lector,'.'));

   for(i = 0 ; i < 256 ; i++)
   {
       if(repeticiones[i])
           printf("%c: %d repeticiones\n",i,repeticiones[i]);
   }


Pues no, te pide la posición en la tabla ASCII de los caracteres y el numero de caracteres. El código queda así:

   char lector[11];
   char repeticiones[256];
   int i,total = 0;

   memset(repeticiones,0,256);

   do{
       fgets(lector,10,stdin);

        for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
           repeticiones[lector[i]]++;

   }while(!strchr(lector,'.'));

   for(i = 0 ; i < 256 ; i++)
   {
       if(repeticiones[i])
           printf("%c: ASCII %d\n",i,i);
       total += repeticiones[i];
   }

   printf("%d caracteres\n",total);


¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

rir3760

Cita de: do-while en  8 Agosto 2013, 10:36 AM
Pues no, te pide la posición en la tabla ASCII de los caracteres y el numero de caracteres. El código queda así:
char lector[11];
char repeticiones[256];
int i,total = 0;

memset(repeticiones,0,256);

do{
  fgets(lector,10,stdin);

  for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
      repeticiones[lector[i]]++;

}while(!strchr(lector,'.'));

for(i = 0 ; i < 256 ; i++)
{
  if(repeticiones[i])
      printf("%c: ASCII %d\n",i,i);
  total += repeticiones[i];
}

printf("%d caracteres\n",total);
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:
char lector[11];
char repeticiones[256] = {0};
int i,total = 0;

do {
  fgets(lector,10,stdin);

  for(i = 0 ; lector[i] && lector[i] != '\n' && lector[i] != '.' ; i++)
      repeticiones[lector[i]]++;

}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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

MeCraniDOS

El código lo tenia hecho y modifique algo para que tuviera una idea de por donde empezar :)
"La física es el sistema operativo del Universo"
     -- Steven R Garman

HijoDePuta

#9
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