Kroki, aby usunąć znak nowej linii w możliwie najbardziej oczywisty sposób:
- Określ długość łańcucha wewnątrz
NAMEza 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
\0znak (pusty ciąg). W takim przypadku slbyłoby, 0ponieważ, strlen()jak powiedziałem powyżej, nie liczy się \0i 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ń \nna \0. Pamiętaj, że liczenie indeksów zaczyna się od, 0wię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 NAMEbędzie później pusty.
- Możemy połączyć krok 2. i 3. razem w jednym
ifzestawieniu, 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ą fgetscią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 \0w 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! =)