As etapas para remover o caractere de nova linha da maneira talvez mais óbvia:
- Determine o comprimento da string dentro
NAME
usando strlen()
, header string.h
. Observe que strlen()
não conta a terminação \0
.
size_t sl = strlen(NAME);
- Veja se a sequência começa com ou inclui apenas um
\0
caractere (sequência vazia). Nesse caso sl
seria 0
porque, strlen()
como eu disse acima, não conta \0
e para na primeira ocorrência:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Verifique se o último caractere da sequência correta é um caractere de nova linha
'\n'
. Se for esse o caso, substitua \n
por a \0
. Observe que as contagens de índice começam em, 0
portanto, precisaremos NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Observe que se você pressionar Enter apenas na fgets()
solicitação de sequência (o conteúdo da sequência era composto apenas por um caractere de nova linha), a sequência NAME
será uma sequência vazia posteriormente.
- Podemos combinar os passos 2. e 3. juntos em apenas um
if
declaração usando o operador lógico &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- O código finalizado:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Se você preferir uma função para usar essa técnica, manipulando as fgets
seqüências de saída em geral sem redigitar todas as vezes, aqui 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';
}
}
No seu exemplo fornecido, seria:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Observe que esse método não funciona se a string de entrada tiver incorporado \0
s . Se fosse esse o caso strlen()
, retornaria apenas a quantidade de caracteres até o primeiro \0
. Mas essa não é uma abordagem comum, já que as funções de leitura de cordas geralmente param na primeira\0
e levam a string até esse caractere nulo.
Além da pergunta por si só. Tente evitar negações duplas que tornam a sua unclearer código: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Você pode simplesmente fazer if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(pelo menos não use duas negações, e =!)