¿Alguien sabe de alguna funcion "gets" que no imprima el salto de linea final?

Iniciado por Usuario887, 13 Noviembre 2021, 18:59 PM

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

Usuario887

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...

MAFUS

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:
#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.


RayR

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:


GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &consInfo);
fgets(...);
// calculas el numero de caracteres que se introdujeron, y luego...
consInfo.dwCursorPosition.X += n_caracteres;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), consInfo.dwCursorPosition);


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.

AlbertoBSD

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

Yo lo hago utilizando una funcion trim.

char *ltrim(char *str, const char *seps) {
size_t totrim;
if (seps == NULL) {
seps = "\t\n\v\f\r ";
}
totrim = strspn(str, seps);
if (totrim > 0) {
size_t len = strlen(str);
if (totrim == len) {
str[0] = '\0';
}
else {
memmove(str, str + totrim, len + 1 - totrim);
}
}
return str;
}

char *rtrim(char *str, const char *seps) {
int i;
if (seps == NULL) {
seps = "\t\n\v\f\r ";
}
i = strlen(str) - 1;
while (i >= 0 && strchr(seps, str[i]) != NULL) {
str[i] = '\0';
i--;
}
return str;
}

char *trim(char *str, const char *seps) {
return ltrim(rtrim(str, seps), seps);
}
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW