As etapas para remover o caractere de nova linha da maneira talvez mais óbvia:
- Determine o comprimento da string dentro
NAMEusando 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
\0caractere (sequência vazia). Nesse caso slseria 0porque, strlen()como eu disse acima, não conta \0e 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 \npor a \0. Observe que as contagens de índice começam em, 0portanto, 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 NAMEserá 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 fgetsseqüê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 =!)