Wie entferne ich \ n oder \ t von einer gegebenen Zeichenkette in C?

8

Wie kann ich eine Zeichenfolge mit allen \ n und \ t in C strippen?

    
goe 03.10.2009, 23:54
quelle

5 Antworten

14

Das funktioniert in meinen schnellen und schmutzigen Tests. Ist es an Ort und Stelle:

%Vor%

Und um Chris zu beschwichtigen, ist hier eine Version, die zuerst eine Kopie erstellt und sie zurückgibt (also wird es mit Literalen funktionieren). Sie müssen free das Ergebnis.

%Vor%     
Evan Teran 04.10.2009 00:00
quelle
4

Wenn Sie \ n oder \ t durch etwas anderes ersetzen möchten, können Sie die Funktion strstr () verwenden. Es gibt einen Zeiger auf den ersten Platz in einer Funktion mit einer bestimmten Zeichenfolge zurück. Zum Beispiel:

%Vor%

Sie können das in einer Schleife ausführen, um alle \ n's und \ t's zu finden.

Wenn Sie sie "strippen" möchten, dh sie aus der Zeichenfolge entfernen , müssen Sie tatsächlich die gleiche Methode wie oben verwenden, aber kopieren Sie den Inhalt der Zeichenfolge "zurück" alle Zeit finden Sie ein \ n oder \ t, so dass "das ist ein Test" wird: "Dies ist ein Test".

Sie können das mit memmove tun (nicht memcpy, da src und dst auf überlappenden Speicher zeigen), so:

%Vor%

Sie müssen diese Schleife erneut wiederholen, um die \ t's zu entfernen.

Hinweis: Beide Methoden funktionieren direkt. Dies ist möglicherweise nicht sicher! (Lesen Sie die Kommentare von Evan Teran für Details. . Auch diese Methoden sind nicht sehr effizient, obwohl sie eine Bibliotheksfunktion für einen Teil des Codes verwenden, anstatt Ihre eigenen zu rollen.

    
Edan Maor 04.10.2009 00:07
quelle
3

Grundsätzlich haben Sie zwei Möglichkeiten: Sie können eine Kopie der ursprünglichen Zeichenfolge erstellen, abzüglich aller '\t' - und '\n' -Zeichen, oder Sie können die Zeichenfolge "in-place" entfernen. Ich wette jedoch, dass die erste Option schneller sein wird, und ich verspreche Ihnen, dass es sicherer ist.

Also machen wir eine Funktion:

%Vor%

Wir möchten strlen() und malloc() , um einen neuen char * -Puffer der gleichen Größe wie unser str -Puffer zuzuweisen. Dann gehen wir durch str Zeichen für Zeichen. Wenn das Zeichen nicht in d enthalten ist, kopieren wir es in unseren neuen Puffer. Wir können etwas wie strchr() verwenden, um zu sehen, ob sich jedes Zeichen in der Zeichenfolge d befindet. . Sobald wir fertig sind, haben wir einen neuen Puffer, mit dem Inhalt unseres alten Puffers minus Zeichen in der Zeichenkette d , also geben wir einfach diesen zurück. Ich gebe Ihnen keinen Beispielcode, da dies vielleicht Hausaufgaben sind, aber hier ist die Beispielverwendung, um Ihnen zu zeigen, wie sie Ihr Problem löst:

%Vor%     
Chris Lutz 04.10.2009 00:05
quelle
1

Dies ist eine c-String-Funktion, die ein beliebiges Zeichen in accept findet und einen Zeiger auf diese Position oder NULL zurückgibt, wenn sie nicht gefunden wird.

%Vor%

Beispiel:

%Vor%

first_occ zeigt auf das \ t oder die 15 Zeichen in search . Sie können ersetzen und dann erneut zum Durchschleifen aufrufen, bis alle ersetzt wurden.

    
user224579 04.10.2009 00:18
quelle
0

Ich möchte, dass die Standardbibliothek so viel Arbeit wie möglich macht, also würde ich etwas verwenden, das der Lösung von Evan ähnlich ist, aber mit strspn() und strcspn() .

%Vor%     
finnw 04.10.2009 01:27
quelle

Tags und Links