Wie zu entfernen \n oder \t, der aus einem gegebenen string in C?
Wie kann ich die Streifen ein string alle \n und \t in C?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie kann ich die Streifen ein string alle \n und \t in C?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese funktioniert in meinem quick-and-dirty tests. Tut es in Ort:
Und zu beschwichtigen, Chris, hier ist eine version, die eine Kopie der ersten und wieder (so funktioniert das auf-Literale). Sie müssen
free
das Ergebnis.main()
geändertchar *buf = ...;
? Was ist, wenn dies war in mehr gewundenen code und der Programmierer vergessen hatte, die Argumente waren beschreibbaren Puffer und welche nicht?char*
oderchar[]
einen Unterschied macht. Außerdem gibt es einen bug instrip
: der string ist nicht null-terminiert ist.char *buf = "hello\tworld"
das ist illegal, weil Sie nicht ändern können Sie einen Zeiger auf ein literal. meinestrip_copy
- Adressen.Wenn Sie möchten, ersetzen Sie \n oder \t, mit etwas anderem, können Sie die Funktion strstr(). Es gibt einen Zeiger auf die erste Stelle in einer Funktion, die eine bestimmte Zeichenfolge. Zum Beispiel:
Können Sie ausführen, dass in einer Schleife alle zu finden \n und \t ' s.
Wenn Sie wollen, "Streifen", d.h. entfernen Sie Sie aus dem string, die Sie brauchen, um tatsächlich verwenden Sie die gleiche Methode wie oben, aber kopieren Sie den Inhalt des string, "zurück" jedes mal, wenn Sie ein \n oder \t, so dass "dieser i\ns ein test" wird zu: "dies ist ein test".
Kannst du das mit memmove (nicht memcpy, da die src-und dst zeigen überlappende Speicher), etwa so:
Müssen Sie wiederholen Sie diese Schleife wieder zu entfernen \t ist.
Hinweis: Beide Methoden arbeiten in-place. Dies könnte nicht sicher sein! (Lesen Evan Teran Kommentare für details.. Auch diese Methoden sind nicht sehr effizient, obwohl Sie zu tun nutzen eine library-Funktion, die für einige der code, anstatt Ihre eigenen Rollen.
memmove()
ist leider relativ unbekannt.Grundsätzlich haben Sie zwei Möglichkeiten, dies zu tun: erstellen Sie eine Kopie des ursprünglichen Strings, abzüglich aller
'\t'
und'\n'
Zeichen, oder Sie können Streifen den string "in place." Aber ich Wette Geld, dass die erste option wird schneller sein, und ich verspreche Ihnen, es wird sicherer sein.Also machen wir eine Funktion:
Wollen wir nutzen,
strlen()
undmalloc()
zuweisen eine neuechar *
Puffer der gleichen Größe wie unserestr
Puffer. Dann gehen wir durchstr
von Zeichen. Wenn sich der Charakter nicht enthalten ind
kopieren wir es in unserer neuen Puffer. Wir können etwas wiestrchr()
um zu sehen, ob jedes Zeichen in der Zeichenfolged
. Sobald wir fertig sind, haben wir einen neuen buffer, mit dem Inhalt unserer alten Puffer minus-Zeichen in der Zeichenfolged
, so dass wir nur zurückgeben. Ich werde nicht geben Ihnen Beispiel-code, da dies vielleicht die Hausaufgaben, aber hier ist das Beispiel, um zu zeigen, wie Sie Ihr problem löst:Dies ist ein c-string-Funktion, die findet alle Zeichen in
accept
und gibt einen Zeiger auf die position oder NULL, wenn es nicht gefunden wird.Beispiel:
first_occ
auf den \t, oder die 15-Zeichen-insearch
. Sie ersetzen können, dann rufen Sie erneut, um die Schleife durch, bis Sie alle ersetzt wurden.Ich mag, um die standard-Bibliothek tun, so viel Arbeit wie möglich, so würde ich etwas ähnliches wie Evan ' s-Lösung, aber mit
strspn()
undstrcspn()
.