Entfernen von Leerzeichen aus einer Zeichenfolge in C?
Was ist der einfachste und effizienteste Weg, um entfernen Sie Leerzeichen aus einem string in C?
InformationsquelleAutor der Frage Tyler Treat | 2009-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfachste und effizienteste in der Regel nicht gehen zusammen...
Hier ist eine mögliche Lösung (ungetestet):
InformationsquelleAutor der Antwort Aaron
Hier ist eine sehr kompakte, aber völlig richtige version:
Und hier, nur für meine Belustigung, sind code-Golf gespielt-Versionen, die nicht völlig korrekt ist, und bekommen Kommentatoren aufregen.
Wenn Sie es sich leisten können, etwas nicht definiertes Verhalten, und nie mit leeren Saiten, können Sie loswerden der Körper:
Teufel, wenn durch Leerzeichen meinst du einfach Leerzeichen:
Nicht in Produktion 🙂
InformationsquelleAutor der Antwort Kornel
Wie wir sehen können aus die Antworten gepostet werden, ist dies überraschend nicht triviale Aufgabe. Wenn man vor einer Aufgabe wie dieser, es würde scheinen, dass viele Programmierer wählen, um zu werfen, den gesunden Menschenverstand aus dem Fenster, um zu produzieren die meisten obskuren snippet, das Sie möglicherweise mit oben kommen kann.
Dinge zu beachten:
' '
.Was ich tun würde:
In diesem code wird der source-string "str_untrimmed" unberührt bleibt, dem wird garantiert durch die Verwendung der richtigen const-Korrektheit. Es wird nicht Abstürzen, wenn der source-string enthält nichts als eine null-Terminierung. Es ist immer null beendet wird der Ziel-string.
Zuweisung von Speicher übrig ist, um zu dem Anrufer. Der Algorithmus sollte nur konzentrieren sich auf seine vorgesehene Arbeit. Es entfernt alle Leerzeichen.
Gibt es keine subtilen tricks in den code. Es wird nicht versuchen, squeeze in so vielen Betreibern wie möglich in einer einzigen Zeile. Es wird ein sehr schlechter Kandidat für die IOCCC. Aber es ergibt so ziemlich den gleichen Maschinencode wie die obskuren one-liner-Versionen.
Beim kopieren etwas, kann man aber optimieren, ein wenig, indem er erklärte, sowohl Zeiger als
restrict
die ein Vertrag zwischen dem Programmierer und der compiler, wo der Programmierer garantiert, dass Ziel und Quelle sind nicht die gleiche Adresse (oder eher, dass die Daten, die Sie zeigen, werden nur zugänglich durch, die sehr Zeiger und nicht durch andere Zeiger). Dies ermöglicht eine effizientere Optimierung, da der compiler kann dann die Kopie direkt von der Quelle zum Ziel, ohne den temporären Speicher zwischen.InformationsquelleAutor der Antwort Lundin
In C, können Sie ersetzen einige Zeichenfolgen in-place), beispielsweise eine Zeichenfolge zurückgegeben, die von strdup():
Anderen Zeichenketten sind nur-lese-zum Beispiel jene, die erklärt-code. Sie hätte kopieren Sie diese auf einen neu reservierten Speicherbereich, und füllen Sie die Kopie durch das überspringen der Leerzeichen:
Können Sie sehen, warum die Leute erfunden, die anderen Sprachen 😉
InformationsquelleAutor der Antwort Andomar
Noten;
InformationsquelleAutor der Antwort quark
wenn Sie noch daran interessiert sind, diese Funktion entfernt Leerzeichen vom Anfang der Zeichenfolge, und ich hatte es in meinem code:
InformationsquelleAutor der Antwort Alfredo
Die einfachste und effizienteste Weg, um entfernen Sie Leerzeichen aus einem string entfernen Sie einfach die Leerzeichen aus dem string-literal. Zum Beispiel, verwenden Sie Ihren editor, um 'suchen und ersetzen'
"hello world"
mit"helloworld"
und presto!Okay, ich weiß, das ist nicht, was Sie meinte. Nicht alle Saiten kommen aus string-literalen, richtig? Angenommen, dass diese Zeichenfolge, die Sie wollen die Leerzeichen entfernt von nicht von ein string-literal ist, dann müssen wir die Quelle und das Ziel Ihrer string... müssen Wir berücksichtigen Ihre gesamten Algorithmus, was eigentliche problem Sie versuchen zu lösen, um zu suggerieren, die einfachste und optimale Methoden.
Vielleicht ist Ihr string kommt aus einer Datei (z.B.
stdin
) und ist verpflichtet, schriftlich auf eine andere Datei (z.B.stdout
). Wenn das der Fall ist, würde ich die Frage stellen, warum es überhaupt braucht, um werden eine Zeichenfolge in den ersten Platz. Genauso zu behandeln wie wenn es ein stream von Zeichen, wobei die Leerzeichen als Sie stoßen Sie...Durch die Beseitigung der Notwendigkeit für die Lagerung der Schnur, nicht nur das gesamte Programm viel geworden, viel kürzer, aber theoretisch auch viel effizienter.
InformationsquelleAutor der Antwort user1989425
InformationsquelleAutor der Antwort Narayan Singh
Ich nehme an die C-string ist in einem festen Speicher, so dass, wenn Sie ersetzen Sie Räume, die Sie haben, zu verschieben aller Zeichen.
Am einfachsten scheint es zu sein, neue Zeichenfolge erstellen und iterieren über das original und die Kopie nur nicht Leerzeichen.
InformationsquelleAutor der Antwort stefanB
Das ist die einfachste, die ich denken konnte (GETESTET) und es funktioniert!!
InformationsquelleAutor der Antwort nAiN
Code entnommen zString Bibliothek
Code-Beispiel
Haben eine llok an der zString-code, können Sie es nützlich finden
https://github.com/fnoyanisi/zString
InformationsquelleAutor der Antwort Fehmi Noyan ISI
Stieß ich auf eine Variante zu dieser Frage, wo Sie brauchen, um zu reduzieren multiplizieren Räume in einem Raum "repräsentieren," der Räume.
Dies ist meine Lösung:
Hoffe es hilft 🙂
InformationsquelleAutor der Antwort eyaler