C/Visual C - Ayuda con control de longitud de cadena

 
Vista:

Ayuda con control de longitud de cadena

Publicado por Julian (1 intervención) el 07/08/2006 17:00:28
Hola a todos.

Tengo un gran problema con un programa en C que estoy haciendo como proyecto, y es acerca de validar una cadena de longitud de 4 caracteres ingresado como dato de entrada.

Paso a explicarles:

El programa me pide ingresar una cadena de longitud de 4 caracteres. Lo solucioné a medias creando un array de cadena de esta forma: char strCadena[10] de tal manera que le estoy dando una tolerancia de longitud 9 si por error ingreso una cadena mayor a 4 caracteres y así controlar la validación por medio un mensaje “Dato no válido, la longitud sobrepasa los 4 caracteres”. Ahora, ¿qué sucede si ingreso una cadena (por consola por supuesto) de longitud mayor a 10?. La respuesta obvia sería: aumentar la longitud del array poniendo strCadena[1000] por ejemplo. Sin embargo estaría desaprovechando recursos si al final solo uso 4 posiciones. Incluso nadie nos aseguraría que no vayamos a superar la cantidad de 10000.

Debemos tener muy en cuenta que si ingresamos como dato una cadena de longitud mayor al especificado en la dimensión del array de cadena, Windows nos arrojaría un mensaje de error y el PC podría colgarse, con la consiguiente pérdida de datos; y así nuestra aplicación sería insegura e inestable.

Probé muchos algoritmos para solucionar este inconveniente pero no tuve éxito. Necesitaría hacer un código que a medida que ingrese cada carácter (sin pulsar la tecla <Enter>), el programa me vaya contando la cantidad de caracteres ingresados hasta llegar a 4, y ahí detener el ingreso de más caracteres, o algo parecido. También probé con arrays dinámicos pero tampoco tuve éxito.

Investigué las librerías estándar de C y sus funciones pero no encontré nada al respecto.
Debería haber alguna librería no estándar por ahí que solucione mi problema.

Creo que esto le habrá pasado a muchos a la hora de optimizar un programa.

Les agradezco a todos y espero que alguien me dé alguna solución.

Saludos cordiales.

P.D. Uso el compilador Dev-Cpp 4.9.9.2
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con control de longitud de cadena

Publicado por JuanC (57 intervenciones) el 07/08/2006 22:12:11
Deberías ver las sig. funciones: scanf , gets, cgets, getchar, getch, getche, bioskey....

Ejemplo:

#include <stdio.h>

void main()
{
char cad[4];

scanf("%4s", &cad); //Leer 4 caracteres
printf("%s", cad);
}

Saludos desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con control de longitud de cadena

Publicado por Julian (5 intervenciones) el 09/08/2006 16:50:41
JuanC lamento decirte que tu código no solucionó mi problema.

Hice ésto:

/* Par el compilador Dev-Cpp */
#include <stdio.h>
#include <string.h>
int main() {
char cad[6];
unsigned char e=0;
do {
printf("\nIngresa una cadena de longitud de 4 caracteres: ");
scanf("%6s", &cad); /* Lee solo 6 caracteres */
if(strlen(cad)>4) {
puts("\nLa longitud de la cadena sobrepasa los 4 caracteres"); e=1;
}
else {
printf("\nLa cadena esta denro de los 4 caracteres "); e=0;
}
} while(e==1);
getch();
return 0;
}

Al ingresar una cadena de longitud mayor de 6 caracteres, el programa
arroja resultados indeseados.

Creo que la única solución que tengo en mente es utilizar archivos de texto. Debe
ser algo así:

/* Par el compilador Dev-Cpp */
#include <stdio.h>
int main() {
int c;
FILE* pf
char *salida="C:\salida.txt";
if((pf=fopen(salida,"wt"))==NULL) {
puts("Error en la operacion de apertura");
return 1;
}
while((c=getchar())!=EOF) {
putc(c, pf);
}
fclose(c, pf);
getch();
return 0;
}

Es decir, ingreso como dato (por consola) una cadena de cualquier longitud. Este dato se coloca
en un archivo de texto previamente creado. Una vez que la cadena está en el archivo,
leo de alguna forma su longitud y lo mando a un array dinámico con esa dimensión... y ahí hago
las validaciones pertinentes.

Por favor, si alguien tiene otra solución más fácil mándenmelo. Les dejo mi correo: [email protected]

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con control de longitud de cadena

Publicado por JuanC (57 intervenciones) el 10/08/2006 12:56:17
A ver si ahora funciona...
El problema era el ciclo do {} while()

#include <stdio.h>
#include <string.h>

main()
{
char cad[6];

do {
printf("\nIngresa una cadena de longitud de 4 caracteres: ");
scanf("%6s", cad); /* Lee 6 caracteres como máximo */

fflush(stdin);

if(strlen(cad)>4){
puts("\nLa longitud de la cadena es mayor a 4");
}
else {
printf("\nLa longitud de la cadena es menor a 4");
break;
}

} while(1);

getch();

return 0;
}

Saludos, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con control de longitud de cadena

Publicado por Nelek (816 intervenciones) el 09/08/2006 17:06:21
Si es c++, debes de tener el mensaje que detecta las pulsaciones de las teclas.

Por que no te creas la funcion por ahi? A cada pulsación guardas la letra pulsada, aumentas un contador y cuando llegues al limite que te de la gana, lanzas el mensaje de error como que no puedes seguir introduciendo caracteres y guardas los 4 que si que eran validos.

Problema: esto no comprueba si la cadena es mayor a 4 o no, simplemente te deja meter 4 letras y luego haces un break o algo asi que detenga la introduccion.

Ahora voy muy pillado de tiempo pero bueno, ya tienes una idea alternativa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con control de longitud de cadena

Publicado por Julian (5 intervenciones) el 09/08/2006 17:53:09
Lo que necesito es el código en C y no en Cpp

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con control de longitud de cadena

Publicado por Nelek (816 intervenciones) el 09/08/2006 23:19:30
Ahm, como vi lo del compilador "Cpp" supuse lo demás. De todas maneras en C también se debería poder capturar el mensaje de "Tecla pulsada" lo que no tengo claro como. Yo soy de versiones más avanzadas donde ese tipo de mensajes es bastante más sencillo de utilizar.

Una pregunta, cuando dices...

"Necesitaría hacer un código que a medida que ingrese cada carácter (sin pulsar la tecla <Enter>), el programa me vaya contando la cantidad de caracteres ingresados "

te refieres a que no tienes permitido usar el enter para nada?

Lo digo por que si es así... lo de mandar la cadena a un archivo también te las va a gastar putas.

Yo sigo diciendo que busques a ver lo de la pulsación de las teclas, que debe de estar por narices. Siento no poder ser más explícito sobre esto.

Más o menos la idea va por...:

void main ()
{
int nCuenta = 0;
cadena[3]
printf ("Introduzca la cadena deseada");

//Aquí iría la función para detectar las pulsaciones de las teclas (que no se su prototipo)
{
cadena [nCuenta] = getchar (); //o el que se encargue de recibir UNA ÚNICA LETRA
nCuenta++;
if (nCuenta == 4) //si ya se han introducido los 4 caracteres necesarios (0, 1, 2 y 3)
goto EtiquetaFinal; //A modo de return o de break
}
EtiquetaFinal:
printf ("Ya se han introducido 4 caracteres, no es posible introducir más");
}

Esta claro que esto no es más que una idea. En este caso el printf detras de la etiqueta se ejecutaría siempre al estar al final de la función principal, pero conforme hablas supongo que tienes un nivel aceptable así que el reubicar las cosas como toca no te debería costar mucho.

Lo del mensaje de tecla_presionada en C no tengo ni idea, pero en VC++ con lo que yo programo es el mensaje "WM_KEYDOWN" o "WM_KEYUP" (a ver si eso te dice algo). Y el prototipo de su función es:

void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

nChar = Tecla virtual (suprimir, escape...) o tecla normal apretada (letra, numero...)

nRepCnt = repeticiones a consecuencia de mantener la tecla presionada

nFlags = Codigo de escaneo, de transicion de tecla, estado de tecla anterior...

Supongo que en C será de otra manera, pero busca a ver, que tiene que existir el mensaje (me atrevo a decir) por narices.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con control de longitud de cadena

Publicado por digies (5 intervenciones) el 16/08/2006 17:47:21
Pues hombre, cual es ese prototipo?????????

Lo debo hacer en C y no en C++

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar