elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?  (Leído 6,596 veces)
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
« en: 13 Noviembre 2021, 18:59 pm »

Hola,

Como saben, la funcion gets generalmente imprime el salto de linea final, por lo que el cursor salta de linea cuando se presiona [Enter] ademas de solo guardar la cadena. Lo que me gustaria saber es si hay una funcion como esta que no imprima este salto de linea, sino que se quede en la misma linea

Gracias...


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
« Respuesta #1 en: 22 Noviembre 2021, 16:50 pm »

Te recomiendo cambiar gets por fgets.

Si no quieres el salto de línea lo mejor es que lo busques y lo borres.

Una solución podría ser:
Código:
#include <string.h> // strchr

// ...

fgets(buffer, MAX_LENGTH, stdin);

// Miro si se capturó el salto de línea con fgets.
char *c = strchr(buffer, '\n');
if(c) {
    // Si se capturó transformo el salto de línea en fin de cadena.
    *c = '\0';
} else {
    // No se capturó, pues aprovecho y borro lo que haya quedado en stdin.
    while(getchar()!='\n');
}



Editado: quitando la parte que recomendaba cambiar de foro por estar mal ubicado.


« Última modificación: 24 Noviembre 2021, 10:15 am por MAFUS » En línea

Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
« Respuesta #2 en: 23 Noviembre 2021, 16:19 pm »

Eso podria funcionar. Gracias por tu respuesta
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
« Respuesta #3 en: 24 Noviembre 2021, 17:59 pm »

Si entendí bien, limpiar el buffer no te va a servir para lo que quieres. Luego de presionar Enter, el cursor ya se movió. Que después lo limpies del buffer interno no altera de ninguna manera lo que está en pantalla.

Que yo sepa no hay ninguna función ni modo de consola que permita lo que quieres, pero sí puedes escribir una función propia que haga exactamente lo que necesitas. Podrías implementarla mediante _getch(), por ejemplo.


Alternativamente, podrías reposicionar manualmente el cursor. Por ejemplo:

Código
  1. GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &consInfo);
  2. fgets(...);
  3. // calculas el numero de caracteres que se introdujeron, y luego...
  4. consInfo.dwCursorPosition.X += n_caracteres;
  5. SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), consInfo.dwCursorPosition);
  6.  

Aclarando que si el número de caracteres introducidos es muy grande y ocupa más de una línea, habría que hacer un par de cálculos más para determinar en que columna y línea se presionó el Enter.
« Última modificación: 24 Noviembre 2021, 18:26 pm por RayR » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
« Respuesta #4 en: 25 Noviembre 2021, 12:08 pm »

Si, como te recomiendan es mejor utilizar fgets y quitar el retorno de linea manualmente.

Yo lo hago utilizando una funcion trim.

Código
  1. char *ltrim(char *str, const char *seps) {
  2. size_t totrim;
  3. if (seps == NULL) {
  4. seps = "\t\n\v\f\r ";
  5. }
  6. totrim = strspn(str, seps);
  7. if (totrim > 0) {
  8. size_t len = strlen(str);
  9. if (totrim == len) {
  10. str[0] = '\0';
  11. }
  12. else {
  13. memmove(str, str + totrim, len + 1 - totrim);
  14. }
  15. }
  16. return str;
  17. }
  18.  
  19. char *rtrim(char *str, const char *seps) {
  20. int i;
  21. if (seps == NULL) {
  22. seps = "\t\n\v\f\r ";
  23. }
  24. i = strlen(str) - 1;
  25. while (i >= 0 && strchr(seps, str[i]) != NULL) {
  26. str[i] = '\0';
  27. i--;
  28. }
  29. return str;
  30. }
  31.  
  32. char *trim(char *str, const char *seps) {
  33. return ltrim(rtrim(str, seps), seps);
  34. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines