validacion de cadenas en c++

Iniciado por d91, 13 Abril 2014, 15:13 PM

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

d91

hola a todos tengo que hacer mi proyecto final en estructura de datos pero tengo que validar entradas, en c++ se puede comprobando la cadena despues del enter, pero yo quiero hacerlo caracter por caracter casi lo logro, lo unico es que no puedo borrar un caracter presionando backspace, porque solo tengo comprendidas las teclas del abecedario y espacio y las envio a una funcion para que las guarde en un arreglo alguien me puede ayudar aqui esta el codigo


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

char bufletras[25];
int contletras=0;
int num, lon;

char emite(int numero){
  bufletras[contletras]=numero;
  contletras+1;

   return *bufletras;
}
main(){

cout<<"Escriba su nombre: ";
   do{
   num=getch();
if(num>='a' && num<='z')
      {cout<<emite(num);}
   else if(num>='A' && num<='Z')
     { cout<<emite(num);}
   else if(num==0x20)//space
{cout<<emite(num);}
    //else if(num==0x8)  //de la tecla backspace

   }while(num!=13); //enter
}

amchacon

#1
"Borrar" sería retroceder un caracter, imprimir un espacio y volver a retroceder un caracter. Había una función llamada gotoxy que sirvia para moverte a una posición x,y de la consola.

Pero no entiendo porque te complicas tanto, lo que estas haciendo es mucho más oscuro y peor que el sistema estandar.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

No se, no termino de ver tu sistema:

* ¿Te has planteado cómo validar "números"? En el caso de números en coma flotante vas a tener en cuenta la precisión decimal o conviertes sin más ? el resultado no va a ser el mismo.

* ¿ Y qué va a suceder con el comando de "pegar" de la consola ?

Utilizar un sistema "normal" de entrada de datos suele dar menos problemas:

* El sistema está sobradamente probado, por lo que aseguras su funcionamiento.

* Es lo que espera un usuario estándar, por lo que tendrá menos problemas para usarlo.

* Dar un mensaje de error suele ser más explicativo que no dejar que se introduzca un carácter.

* Puedes dar una cobertura más uniforme a lenguajes no contemplados por la tabla ASCII

De hecho, la inmensa mayoría de las aplicaciones en modo consola ( incluso aquellas que tienen una "interfaz gráfica" emulada desde la consola ) te permiten introducir cualquier cosa y te la validan al pulsar el enter o al "cambiar" de input.

amchacon

Eferion lo ha explicado perfecto solo tengo que añadir un punto más:

* El programa es portable y puede compilarse en otras plataformas/SO sin dificultad.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#4
Sólo unos pequeños detalles previos:

* <iostream> sin el .h

* <cstring> sin el .h

* <cstdio> sin el .h

* main es int y como tal ha de tener su correspondiente return.

* contletras+1 no hace nada, sólo suma 1 a contletraspero no lo almacena en el mismo.

Esto último hace que la flauta haya sonado ya que *buffer siempre apuntará al primer caracter de la cadena buffer y como contletras siempre es cero, ya que no se incrementa, pues da la casualidad de que siempre apuntará al último caracter introducido y el código aparenta funcionar bien.

Pero supongamos que te has dado cuenta y que corriges la expresión contletras+1  por la correcta de contletras++, ¡horror!, ahora sólo sale el primer caracter que escribes, intentas meter leosansan y en pantalla sólo aparece lllllllllll. Curioso que al corregir un error nos demos cuenta del otro error, el de que el return ahora si funciona y como el contador se incrementa el return devuelve lo que tiene que devolver: el primer caracter.

Don´t worry, be happy!, eso se resuelve haciendo que el return de la función emite devuelva justo el último caracter.

Y para hacerlo bien, lo primero es colocar contletras++ donde debe ir: al comienzo dela función e inicializandolo a -1, porque si lo dejas donde está el return devolvería un valor más allá de donde has llegado a llenar el array bufletras y eso no estaría bien, no no.

Ahora funciona O.K:

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

using namespace std;

char bufletras[25];
int contletras=-1;
int num, lon;

char emite(int numero){
 contletras++;
 bufletras[contletras]=numero;
 return bufletras[contletras];
}
int main(){

cout<<"Escriba su nombre: "<<endl;
 do{
 num=getch();
if(num>='a' && num<='z')
     cout<<emite(num);
  else if(num>='A' && num<='Z')
    cout<<emite(num);
  else if(num==0x20)//space
   cout<<emite(num);
   else if(num==0x8)  //de la tecla backspace
     contletras--;
  }while(num!=13); //enter
  cout<< endl<<"Este es su nombre: "<<bufletras;
  return 0;
}


Creo que esto responde a tu otro tema del por qué sólo te imprime en pantalla el primer caracter que introduces pareciendo que getch no hace su función de vaciar su contenido en cada llamada a la misma.

De todas formas, y por si acaso, si la única finalidad de la función era pasar num a char bastaba con usar:


Código (cpp) [Seleccionar]
char emite(int numero){

  return numero;
}


EDITO: Y ya puestos te activo el backspace para eliminar un caracter introducido por error de la cadena final, que no de la pantalla ya que para ello tendría que hacer uso de gotoxy y no sé si es lo que quieres.:

Código (cpp) [Seleccionar]
else if(num==0x8) //de la tecla backspace
 contletras--;


Bueno por si acaso si lo quieras y suponiendo que tu conio.h tiene activada la opcion gotoxy, si no prueba con la conio2.h. Ahora corrige hasta lo que se ve en la pantalla:

Código (cpp) [Seleccionar]
else if(num==0x8) { //de la tecla backspace
 gotoxy(contletras+1,2);
 contletras--;
}


o su equivalente en windows.h:

Código (cpp) [Seleccionar]
.................
#include <windows.h>
........................
int gotoxy(int x, int y);
................................
   else if(num==0x8) { //de la tecla backspace
     gotoxy (contletras,1);
     contletras--;
   }
return 0;
}

int gotoxy(int x, int y)
{
  COORD coord;
  HANDLE h_stdout;
  coord.X = x;
  coord.Y = y;
  if ((h_stdout = GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE)
     return 0;
  if (SetConsoleCursorPosition(h_stdout, coord) == 0)
     return 0;
  return 1;
}




¡¡¡¡ Saluditos! ..... !!!!