Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Usuario887 en 13 Noviembre 2021, 18:59 pm



Título: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
Publicado por: Usuario887 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...


Título: Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
Publicado por: MAFUS 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.


Título: Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
Publicado por: Usuario887 en 23 Noviembre 2021, 16:19 pm
Eso podria funcionar. Gracias por tu respuesta


Título: Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
Publicado por: RayR 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.


Título: Re: ¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?
Publicado por: AlbertoBSD 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. }