Foros del Web » Programación para mayores de 30 ;) » Programación General »

Restringir el largo de una cadena C++

Estas en el tema de Restringir el largo de una cadena C++ en el foro de Programación General en Foros del Web. Lo que estoy haciendo es una especio de formulario para ingresar datos. Es algo simple ya que estoy aprendiendo. Primero pido ciertos datos en donde ...
  #1 (permalink)  
Antiguo 15/06/2003, 17:31
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 21 años, 5 meses
Puntos: 1
Restringir el largo de una cadena C++

Lo que estoy haciendo es una especio de formulario para ingresar datos. Es algo simple ya que estoy aprendiendo.

Primero pido ciertos datos en donde debo restringir el numero de caracteres, eso lo puedo hacer con scanf() pero el problema es que scanf no recibe los espacios de las cadenas que se escriban, entonces lo hice con gets() pero este no restringe el numero de caracteres por lo q hice esto.

Código PHP:
 while(n1>20){
     
printf("Error como maximo escribe 20 caracteres\n");
     
printf("\nIntenalo denuevo..\n");
     
system ("PAUSE");
     
printf("\nNombre (max. 20): ");
     
p1 gets(cad1);
     } 
n1 guarda el numero de caracteres que tiene la cadena por medio de strlen pero el problema es que aunque yo ingrse un solo caracter el bucle no termina continua infinitamente. Solo se detiene cuando ingreso exactamente 20 caracteres.

Como lo puedo hacer?

Desde ya gracias


Saludos
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon
  #2 (permalink)  
Antiguo 15/06/2003, 17:56
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
Puedes usar

char Cadena[20]; //Cadena de 20 caracteres
cin.getline(Cadena,20, "\n");
cout << Cadena << endl;

y en c

char Cadena[20];
char caracter = '\0';
bool terminar = false;
int i =0;

do
{
caracter = _getch();
Cadena[i] = caracter;
printf("%c",Cadena[i]);
i++;
if(i > 20 || caracter == '\n' || caracter == '\13' )
terminar = true;
} while(terminar == false );
Cadena[i+1] = '\0';
printf("\n");

Última edición por Richard2003; 15/06/2003 a las 18:04
  #3 (permalink)  
Antiguo 15/06/2003, 18:14
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 21 años, 5 meses
Puntos: 1
es decir con la forma que diste al principio cuenta los caracters y si son mas los corta. osea no obliga a ingresarlos bien ?
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon
  #4 (permalink)  
Antiguo 15/06/2003, 19:59
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
Sip y además deja un caracter delimitador...

por ej. tu no quieres que el usuario presione una "s", y si la presiona dejara de escribir
  #5 (permalink)  
Antiguo 15/06/2003, 20:38
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Hay otra opcion.

La solucion ideal es:

char cadena[20];

fgets(cadena, 19, stdin);

Simplemente lee 19 caracteres de el flujo de entrada estandar.
Creo que no agrega nuava linea por lo que puedes leer 20 caracteres.
Lo voy a investigar.
--------

Escribe hasta lo ultimo un \0...
Saludos.
bye
  #6 (permalink)  
Antiguo 16/06/2003, 12:06
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 21 años, 5 meses
Puntos: 1
ok gracias voy a probar

Saludos
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon
  #7 (permalink)  
Antiguo 16/06/2003, 12:21
Avatar de Max13  
Fecha de Ingreso: octubre-2000
Ubicación: Mx
Mensajes: 1.229
Antigüedad: 23 años, 6 meses
Puntos: 0
Puedes hacerlo con scanf simplemente poniendo:

sanff(^[\n],variable);

Esto sirve para aceptar todos los caracteres exepto Enter, es decir al teclear enter se corta la cadena, tu ya solo pondrias la cantidad de caracteres que deseas.
  #8 (permalink)  
Antiguo 16/06/2003, 12:25
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 21 años, 5 meses
Puntos: 1
si pero scanf() no coge los espacios como lo hace gets() o fgets()
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon
  #9 (permalink)  
Antiguo 16/06/2003, 12:26
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
si lo que quieres control total sobre la cadena, deberias usar conio
  #10 (permalink)  
Antiguo 16/06/2003, 12:32
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 21 años, 5 meses
Puntos: 1
lo que quiero lograr es que si escribe mas caracteres que los aceptados lo oblige ha hacerlo denuevo. eso lo logre con el codigo que di antes con ese while. Osea funciona , si escribo mas de 20 caracteres (sin contar \0) me obliga ha hacerlo denuevo pero si escribo menos tambien.

Es decir el problema esta en el while. No sale del bucle siempre lo repite.

Podria hacers con un if el problema es que tendria que hacer miles de if y elseif y demases por que los datos que ire pidiendo son bastantes.

Seria psible con un do while? si es asi como debo hacerlo es que no me llevo muy bien con este bucle.

Saludos
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon

Última edición por MSDark; 16/06/2003 a las 12:35
  #11 (permalink)  
Antiguo 16/06/2003, 14:22
Avatar de Max13  
Fecha de Ingreso: octubre-2000
Ubicación: Mx
Mensajes: 1.229
Antigüedad: 23 años, 6 meses
Puntos: 0
scanf si toma los espacions si pones el pequeño codigo que te di ^[\n]
  #12 (permalink)  
Antiguo 16/06/2003, 14:35
Avatar de MSDark  
Fecha de Ingreso: noviembre-2002
Ubicación: Talca VII región
Mensajes: 337
Antigüedad: 21 años, 5 meses
Puntos: 1
ok gracias
__________________
DelirioLinux.. Software Libre y tecnología.. php también..
Saludos :arriba:
Usuario Linux #198486 y Ubuntu #12791
Gutsy Gibbon
  #13 (permalink)  
Antiguo 18/06/2003, 13:08
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Por cierto. Si te funciono lo que te dije???
Creo que era mejor. Ya que solo lee los 20 caracteres o puedes hacer esto:

char cadena[21]=NULL;

do {
fgets(cadena, 20, stdin);
}
while(strlen(cadena)>20 || cadena==NULL);



Talvez sea mejor que fgets.....
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 21:05.