Die Schritte zum Entfernen des Zeilenumbruchs auf die vielleicht offensichtlichste Weise:
- Bestimmen Sie die Länge der Zeichenfolge im Inneren
NAME
mithilfe der strlen()
Kopfzeile string.h
. Beachten Sie, dass strlen()
das Beenden nicht berücksichtigt wird \0
.
size_t sl = strlen(NAME);
- Überprüfen Sie, ob die Zeichenfolge mit einem
\0
Zeichen beginnt oder nur ein Zeichen enthält (leere Zeichenfolge). In diesem Fall sl
wäre, 0
da, strlen()
wie ich oben sagte, das nicht zählt \0
und beim ersten Auftreten davon stoppt:
if(sl == 0)
{
// Skip the newline replacement process.
}
- Überprüfen Sie, ob das letzte Zeichen der richtigen Zeichenfolge ein Zeilenumbruchzeichen ist
'\n'
. Wenn dies der Fall ist, ersetzen Sie \n
durch a \0
. Beachten Sie, dass die Indexzählungen bei beginnen, 0
sodass wir Folgendes tun müssen NAME[sl - 1]
:
if(NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Hinweis: Wenn Sie bei der fgets()
Zeichenfolgenanforderung nur die Eingabetaste gedrückt haben (der Zeichenfolgeninhalt bestand nur aus einem Zeilenumbruchzeichen), ist die NAME
Zeichenfolge danach eine leere Zeichenfolge.
- Wir können Schritt 2. und 3. in nur einer
if
Anweisung zusammenfassen, indem wir den Logikoperator verwenden &&
:
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
- Der fertige Code:
size_t sl = strlen(NAME);
if(sl > 0 && NAME[sl - 1] == '\n')
{
NAME[sl - 1] = '\0';
}
Wenn Sie eine Funktion zur Verwendung dieser Technik fgets
bevorzugen , indem Sie Ausgabezeichenfolgen im Allgemeinen verarbeiten, ohne sie jedes Mal neu einzugeben, finden Sie hier 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';
}
}
In Ihrem Beispiel wäre dies:
printf("Enter your Name: ");
if (fgets(Name, sizeof Name, stdin) == NULL) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
else {
fgets_newline_kill(NAME);
}
Beachten Sie, dass diese Methode nicht funktioniert, wenn in die Eingabezeichenfolge \0
s eingebettet ist. Wenn dies der Fall strlen()
wäre, würde nur die Anzahl der Zeichen bis zum ersten zurückgegeben \0
. Dies ist jedoch kein gängiger Ansatz, da die meisten Funktionen zum Lesen von Zeichenfolgen normalerweise beim ersten anhalten \0
und die Zeichenfolge bis zu diesem Nullzeichen verwenden.
Abgesehen von der Frage für sich. Vermeiden Sie doppelte Negationen, die Ihren Code unklar machen : if (!(fgets(Name, sizeof Name, stdin) != NULL) {}
. Sie können einfach tun if (fgets(Name, sizeof Name, stdin) == NULL) {}
.
if (!fgets(Name, sizeof Name, stdin))
(Verwenden Sie zumindest nicht zwei Negationen! und! =)