I passaggi per rimuovere il carattere di nuova riga nel modo forse più ovvio:
- Determina la lunghezza della stringa all'interno
NAME
usando strlen()
, header string.h
. Si noti che strlen()
non conta il termine \0
.
size_t sl = strlen(NAME);
- Verifica se la stringa inizia con o include solo un
\0
carattere (stringa vuota). In questo caso sl
sarebbe 0
perché strlen()
come ho detto sopra non conta \0
e si ferma alla prima occorrenza di esso:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Controlla se l'ultimo carattere della stringa corretta è un carattere di nuova riga
'\n'
. In tal caso, sostituirlo \n
con a \0
. Si noti che il conteggio degli indici inizia alle ore 0
quindi dovremo fare NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Nota se hai solo premuto Invio alla fgets()
richiesta di stringa (il contenuto della stringa era costituito solo da un carattere di nuova riga) la stringa in seguito NAME
sarà una stringa vuota da allora in poi.
- Siamo in grado di combinare i passaggi 2. e 3. in una sola
if
dichiarazione usando l'operatore logico &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Il codice finito:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Se preferisci una funzione per utilizzare questa tecnica gestendo fgets
le stringhe di output in generale senza dover riscrivere ogni volta, ecco 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';
}
}
Nell'esempio fornito, sarebbe:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Si noti che questo metodo non funziona se la stringa di input ha incorporato \0
s in essa. Se così strlen()
fosse, restituirebbe solo la quantità di caratteri fino al primo \0
. Ma questo non è un approccio abbastanza comune, poiché le funzioni di lettura più stringhe di solito si fermano all'inizio \0
e prendono la stringa fino a quel carattere nullo.
A parte la domanda da sola. Cercate di evitare doppie negazioni che compongono il codice unclearer: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Puoi semplicemente farlo if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(almeno non usare due negazioni,! e! =)