Kroki, aby usunąć znak nowej linii w możliwie najbardziej oczywisty sposób:
- Określ długość łańcucha wewnątrz
NAME
za pomocą strlen()
nagłówka string.h
. Zauważ, że strlen()
nie liczy się zakończenie \0
.
size_t sl = strlen(NAME);
- Sprawdź, czy ciąg zaczyna się od, czy zawiera tylko jeden
\0
znak (pusty ciąg). W takim przypadku sl
byłoby, 0
ponieważ, strlen()
jak powiedziałem powyżej, nie liczy się \0
i zatrzymuje przy pierwszym wystąpieniu:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Sprawdź, czy ostatni znak właściwego ciągu jest znakiem nowego wiersza
'\n'
. W takim przypadku zamień \n
na \0
. Pamiętaj, że liczenie indeksów zaczyna się od, 0
więc będziemy musieli zrobić NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Zauważ, że jeśli naciśniesz Enter tylko na fgets()
żądanie łańcucha (treść łańcucha składała się tylko ze znaku nowej linii), łańcuch NAME
będzie później pusty.
- Możemy połączyć krok 2. i 3. razem w jednym
if
zestawieniu, używając operatora logicznego &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Gotowy kod:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Jeśli wolisz funkcję używającą tej techniki, obsługującą fgets
ciągi wyjściowe w ogóle bez ponownego wpisywania za każdym razem, oto 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';
}
}
W podanym przykładzie byłoby to:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Zauważ, że ta metoda nie działa, jeśli łańcuch wejściowy ma \0
w niej osadzone s. W takim przypadku strlen()
zwracałaby tylko liczbę znaków do pierwszego \0
. Ale nie jest to dość powszechne podejście, ponieważ większość funkcji czytania ciągów zwykle zatrzymuje się na początku\0
i pobiera ciąg znaków aż do znaku o wartości zerowej.
Oprócz samego pytania. Staraj się unikać podwójnych negacji, które czynią swój kod unclearer: if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Możesz po prostu zrobić if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(przynajmniej nie używaj dwóch negacji,! i! =)