Wie leere ich ein char-Array?


86

Haben Sie eine Reihe von Zeichen wie Zeichenmitglieder [255]. Wie kann ich es vollständig leeren, ohne eine Schleife zu verwenden?

Mit "leer" meine ich, dass, wenn einige Werte darin gespeichert waren, dies nicht der Fall sein sollte. Wenn ich zum Beispiel strcat mache, sollte der alte Wert nicht bleiben


3
Was meinst du mit "Array leeren"?
PMG

4
Mitglieder [0] = Mitglieder [1] = Mitglieder [2] = Mitglieder [3] ... = Mitglieder [255] = 0 keine Schleife dort;)
John La Rooy

18
Ihr "Array" ist also eine besondere Art von Array: Es ist ein string. Um einen String zu "leeren", setzen Sie sein erstes Element auf '\ 0':members[0] = '\0';
pmg

Die Community scheint für memset zu sein. Aber ist das angesichts meiner Anforderungen der effizienteste Weg?
Alex Xander

2
@ Alex Xander: "Community" ist in diesem Fall eindeutig falsch. Es gibt Situationen, in denen 'memset' erforderlich ist (z. B. das Löschen von Daten, um eine unbefugte Verwendung zu verhindern), aber für das einfache Zurücksetzen von Zeichenfolgen (wie in Ihrem Fall) lautet die richtige Antwort, nur das erste Element auf Null zu setzen.
AnT

Antworten:


173

mit

im Allgemeinen

wenn sich das Array im Gültigkeitsbereich befindet, oder

Wenn Sie nur den Zeigerwert haben und nMembers die Anzahl der Elemente im Array ist.


BEARBEITEN Natürlich hat sich jetzt die Anforderung von der generischen Aufgabe des Löschens eines Arrays zum reinen Zurücksetzen eines Strings geändert, memsetist übertrieben und es reicht aus, nur das erste Element auf Null zu setzen (wie in anderen Antworten angegeben).


BEARBEITEN Um memset verwenden zu können , müssen Sie string.h einschließen .


6
+1 - Ich würde mich dafür entscheiden, da dadurch sichergestellt wird, dass sich alle Array-Elemente in einem bekannten Zustand befinden.
ChrisBD

Es widerspricht jedoch der (epischen) Anforderung, keine Schleife zu verwenden.
Michael Foukarakis

1
Während memset wahrscheinlich nicht als Rekursion implementiert ist, könnte es sein - in beiden Fällen ist die Iteration anständig verborgen, was die angebliche Voraussetzung war.
Steve Gilham

37

Kommt darauf an, was du mit "leer" meinst:


3
Dies würde nur den Wert von Mitgliedern [0] ändern, nicht von Mitgliedern [1] bis Mitgliedern [254]. Gut, wenn Sie nacheinander zugreifen ... aber in anderen Fällen nicht so gut.
Thomas Owens

3
Nach der Bearbeitung des OP sollte meine Lösung für seine Anforderungen funktionieren, da strcat () das NULL-Byte findet und es entsprechend behandelt.
Felix

3
Keine bessere Lösung. Nur eine Lösung für ein anderes Problem.
Ypnos

4
Es gibt keine Möglichkeit, ein abstraktes Array in C zu "leeren". Jedes Array enthält etwas, auch wenn es Nullen sind. Der Begriff "Leeren eines Arrays" gilt nur für übergeordnete logische Interpretationen von Array-Inhalten. Beispielsweise kann der Inhalt des Arrays als C-String interpretiert werden. In diesem Fall ist der richtige Weg zum "Leeren", das allererste Element auf '\ 0' zu setzen. Genau das, was Felix getan hat. Ich weiß nicht, welche anderen Interpretationen das OP im Sinn haben könnte, aber ohne es genauer zu machen, sind all diese Versuche mit 'memset' nur bedeutungslose Antworten auf eine bedeutungslose Frage.
Am

1
@tinkertim: Hier gibt es kein NULL. Und nein, 'strcat' weiß nicht, wie man mit NULL umgeht. Es wird abstürzen, wenn Sie NULL übergeben.
Am

9

Versuchen Sie nicht, Ihr char-Array auf Null zu setzen, wenn Sie mit Zeichenfolgen arbeiten. Im Folgenden finden Sie eine einfache Möglichkeit, mit den Zeichenfolgen zu arbeiten.

Kopieren (neue Zeichenfolge zuweisen):

Verketten (Zeichenfolge hinzufügen):

Leerer String:

So einfach ist das.


8

char Mitglieder [255] = {0};


1
Nein, weil er nicht angegeben hat, dass dies nach der Initialisierung erfolgen muss. Insbesondere dies wurde möglicherweise in seinem ersten Beispiel vor dem Bearbeiten verstanden und weil es auch ein sehr häufiger Anwendungsfall ist, ein Array zu löschen.
user44556

Ich gebe dir +2 als Entschädigung, die er dir gegeben hat -1: P: D
stviper

5

BEARBEITEN: Angesichts der letzten Bearbeitung der Frage funktioniert dies nicht mehr, da es keine Nullterminierung gibt. Wenn Sie versuchen, das Array zu drucken, werden Ihre Zeichen gefolgt von einer Reihe nicht lesbarer Zeichen angezeigt. Allerdings lasse ich diese Antwort hier als Community-Wiki für die Nachwelt.

Das sollte funktionieren. Gemäß der Programmiersprache C:

Wenn das Array eine feste Größe hat, darf die Anzahl der Initialisierer die Anzahl der Mitglieder des Arrays nicht überschreiten. Wenn weniger vorhanden sind, werden die verbleibenden Mitglieder mit 0 initialisiert.

Dies bedeutet, dass jedes Element des Arrays den Wert 0 hat. Ich bin mir nicht sicher, ob Sie dies als "leer" betrachten würden oder nicht, da 0 ein gültiger Wert für a ist char.


Es hängt davon ab, wie Sie "leer" definieren. Das Zeichen mit dem Wert 0 ist kein für Menschen lesbares Zeichen, und das Zeichenfeld befindet sich in einem bekannten Zustand. Ich würde das für leer halten. Es macht genau das Gleiche wie Memset (wenn meine Erinnerung an Memset korrekt ist - es ist zu lange her, seit ich C verwendet habe).
Thomas Owens

3

Sie können ein Array als solches nicht leeren, es enthält immer die gleiche Datenmenge.

In einem größeren Kontext können die Daten im Array eine leere Liste von Elementen darstellen, dies muss jedoch zusätzlich zum Array definiert werden. Die gebräuchlichste Methode, dies zu tun, besteht darin, eine Anzahl gültiger Elemente zu behalten (siehe die Antwort von pmg) oder Zeichenfolgen zu verwenden, um sie mit einem Nullzeichen zu beenden (die Antwort von Felix). Es gibt auch kompliziertere Möglichkeiten, zum Beispiel verwendet ein Ringpuffer zwei Indizes für die Positionen, an denen Daten hinzugefügt und entfernt werden.


3

ist genug, angesichts Ihrer Anforderungen.

Beachten Sie jedoch, dass der Puffer dadurch nicht "geleert" wird. Der Speicher ist weiterhin zugewiesen, möglicherweise sind noch gültige Zeichenwerte vorhanden usw.


1
Kann auch geschrieben werden als * member = 0;
Eyalm

Auch 0ist ein gültiger Charakter. Wir wissen nicht, ob memberssie als C-String behandelt werden oder nicht.
Sany


2

Ich würde mitgehen


Dies ist sehr sinnvoll, da das OP nach einer Operation (Entleerung) fragt, die nicht Teil eines C-Arrays ist. Daher würde er im Idealfall eine neue Datenstruktur implementieren und die Art und Weise, wie pmg die Struktur signalisiert, ist leer ist gut genug.
Michael Foukarakis

Nein, das ergibt wirklich keinen Sinn.

Kinopiko: Anscheinend verstehen Sie den Ansatz dann nicht
Christian

Kinopiko: Lies die Antwort von Starblue, da sie meine Argumentation besser erklärt, als ich in einem Kommentar erklären kann (danke Starblue)
pmg

Hmm, das ist ein interessanter Ansatz. Wird Members_in_use immer noch ein Array sein? Kann ich später ein machen; member_in_use [5] = Wert? Entspricht dies memset (members_in_use, 0, 255)? wie Steve sagte? Wenn ja, warum eins anstelle des anderen verwenden?

1

Wenn Sie ein Array leeren, wenn Sie auf 0 zurücksetzen möchten, können Sie bzero verwenden.

Wenn Sie das Array mit einem anderen Standardzeichen füllen möchten, können Sie die Memset-Funktion verwenden.


bzero und memset verwenden (normalerweise) beide eine Schleife.
Michael Foukarakis

1

einfacher ist besser - sinnvoll?

In diesem Fall funktionieren nur Mitglieder [0] = 0. Mach eine einfache Frage nicht so kompliziert.


0

Haftungsausschluss: Normalerweise programmiere ich nicht in C, daher kann es in meinen Beispielen zu Syntaxproblemen kommen, aber ich hoffe, dass die Ideen, die ich auszudrücken versuche, klar sind.

Wenn "Entleeren" "eine leere Zeichenfolge enthalten" bedeutet, können Sie einfach das erste Array-Element auf Null setzen, wodurch das Array effektiv eine leere Zeichenfolge enthält:

Wenn "Entleeren" "Freigeben des verwendeten Speichers" bedeutet, sollten Sie zunächst kein festes Zeichenarray verwenden. Stattdessen sollten Sie einen Zeiger auf char definieren und dann entsprechend malloc / free (oder String-Zuweisung) ausführen.

Ein Beispiel, das nur statische Zeichenfolgen verwendet:


0

Sie können die folgende Anweisung verwenden:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.