I passaggi per rimuovere il carattere di nuova riga nel modo forse più ovvio:
- Determina la lunghezza della stringa all'interno
NAMEusando 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
\0carattere (stringa vuota). In questo caso slsarebbe 0perché strlen()come ho detto sopra non conta \0e 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 \ncon a \0. Si noti che il conteggio degli indici inizia alle ore 0quindi 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 NAMEsarà una stringa vuota da allora in poi.
- Siamo in grado di combinare i passaggi 2. e 3. in una sola
ifdichiarazione 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 fgetsle 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 \0s 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 \0e 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! =)