Los pasos para eliminar el carácter de nueva línea de la forma quizás más obvia:
- Determine la longitud de la cadena dentro
NAME
usando strlen()
, encabezado string.h
. Tenga en cuenta que strlen()
no cuenta la terminación \0
.
size_t sl = strlen(NAME);
- Mire si la cadena comienza con o solo incluye un
\0
carácter (cadena vacía). En este caso sl
sería 0
porque, strlen()
como dije anteriormente, no cuenta \0
y se detiene en el primer caso:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Compruebe si el último carácter de la cadena adecuada es un carácter de nueva línea
'\n'
. Si este es el caso, reemplácelo \n
con a \0
. Tenga en cuenta que los recuentos de índices comienzan en, 0
así que tendremos que hacer NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Tenga en cuenta que si solo presionó Entrar en la fgets()
solicitud de cadena (el contenido de la cadena solo consistía en un carácter de nueva línea), la cadena NAME
será una cadena vacía a partir de entonces.
- Podemos combinar los pasos 2. y 3. juntos en una sola
if
declaración utilizando el operador lógico &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- El código terminado:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Si prefiere una función para usar esta técnica manejando fgets
cadenas de salida en general sin volver a escribir cada vez, aquí está fgets_newline_kill
:
void fgets_newline_kill(char a[])
{
size_t sl = strlen(a);
if(sl > 0 && a[sl - 1] == '\n')
{
a[sl - 1] = '\0';
}
}
En su ejemplo proporcionado, sería:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Tenga en cuenta que este método no funciona si la cadena de entrada tiene \0
s integrados . Si ese fuera el caso strlen()
, solo devolvería la cantidad de caracteres hasta el primero \0
. Pero este no es un enfoque bastante común, ya que la mayoría de las funciones de lectura de cadenas generalmente se detienen al principio \0
y toman la cadena hasta ese carácter nulo.
Aparte de la pregunta por sí solo. Trate de evitar las negaciones dobles que hacen que su unclearer código: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Simplemente puedes hacer if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(¡al menos no use dos negaciones,! y! =)