Wie leert man ein Char-Array?

Lesezeit: 5 Minuten

Benutzeravatar von Alex Xander
Alexander Xander

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

char members[255];

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 erhalten bleiben

members = "old value";

//empty it efficiently
strcat(members,"new"); // should return only new and not "old value new"

  • Was meinst du mit “Array leeren”?

    – pmg

    13. Oktober 2009 um 10:53 Uhr

  • Mitglieder[0]= Mitglieder[1]= Mitglieder[2]= Mitglieder[3]…=Mitglieder[255]=0 keine Schleife da 😉

    – John LaRooy

    13. Oktober 2009 um 11:18 Uhr

  • Ihr “Array” ist also eine besondere Art von Array: Es ist a string. Um einen String zu “leeren”, setzen Sie sein erstes Element auf ‘\0’: members[0] = '\0';

    – pmg

    13. Oktober 2009 um 11:27 Uhr

  • Die Community scheint Memset zu bevorzugen. Aber ist das angesichts meiner Anforderungen der effizienteste Weg?

    – Alex Xander

    13. Oktober 2009 um 11:48 Uhr

  • @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 der Zeichenfolge (wie in Ihrem Fall) besteht die richtige Antwort darin, nur das erste Element auf Null zu setzen.

    – AnT steht zu Russland

    13. Oktober 2009 um 14:11 Uhr

Benutzeravatar von Steve Gilham
Steve Gilham

verwenden

  memset(members, 0, 255);

Im Algemeinen

  memset(members, 0, sizeof members);

wenn das Array im Geltungsbereich ist, oder

  memset(members, 0, nMembers * (sizeof members[0]) );

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 allgemeinen Aufgabe zum Löschen eines Arrays zum reinen Zurücksetzen einer Zeichenfolge geändert. memset ist übertrieben und es reicht aus, nur das erste Element auf Null zu setzen (wie in anderen Antworten angegeben).


EDIT Um zu verwenden memsetSie müssen schließen Sie string.h ein.

  • +1 – Ich würde mich dafür entscheiden, da es sicherstellt, dass sich alle Array-Elemente in einem bekannten Zustand befinden.

    – ChrisBD

    13. Oktober 2009 um 11:01 Uhr

  • Es verstößt jedoch gegen die (epische) Anforderung, keine Schleife zu verwenden.

    – Michael Foukarakis

    13. Oktober 2009 um 11:13 Uhr

  • Obwohl Memset wahrscheinlich nicht als Rekursion implementiert ist, könnte dies der Fall sein – in beiden Fällen ist die Iteration anständig vor den Augen verborgen, was die angebliche Anforderung war.

    – Steve Gilham

    13. Oktober 2009 um 11:22 Uhr

Kommt darauf an, was du mit “leer” meinst:

members[0] = '\0';

  • Das würde nur den Wert der Mitglieder verändern[0]nicht Mitglieder[1] durch Mitglieder[254]. Gut, wenn Sie sequentiell zugreifen … aber in anderen Fällen nicht so gut.

    – Thomas Owens

    13. Oktober 2009 um 11:05 Uhr

  • Nach der Bearbeitung durch das OP scheint meine Lösung für seine Anforderungen zu funktionieren, da strcat() das NULL-Byte findet und entsprechend behandelt.

    – Felix

    13. Oktober 2009 um 11:09 Uhr

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

    – ypnos

    13. Oktober 2009 um 11:47 Uhr

  • Es gibt keine Möglichkeit, ein abstraktes Array in C zu “leeren”. Jedes Array enthält etwas, selbst wenn es Nullen sind. Der Begriff des “Leerens eines Arrays” ist nur auf logische Interpretationen von Array-Inhalten auf höherer Ebene anwendbar. Beispielsweise könnte der Inhalt des Arrays als C-String interpretiert werden. In diesem Fall besteht der richtige Weg zum “Leeren” darin, 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.

    – AnT steht zu Russland

    13. Oktober 2009 um 13:52 Uhr

  • @tinkertim: Hier gibt es keine NULL. Und nein, ‘strcat’ weiß nicht, wie es mit NULL umgehen soll. Es stürzt ab, wenn Sie ihm NULL übergeben.

    – AnT steht zu Russland

    13. Oktober 2009 um 14:33 Uhr

Benutzeravatar von Andrejs Cainikovs
Andrejs Cainikovs

Versuchen Sie nicht, Ihr Char-Array auf Null zu setzen, wenn Sie mit Strings arbeiten. Unten finden Sie eine einfache Möglichkeit, mit Zeichenketten zu arbeiten.

Kopieren (neuen String zuweisen):

strcpy(members, "hello");

Verketten (fügen Sie die Zeichenfolge hinzu):

strcat(members, " world");

Leerer String:

members[0] = 0;

Einfach so.

Char-Mitglieder[255] = {0};

BEARBEITEN: Angesichts der letzten Bearbeitung der Frage funktioniert dies nicht mehr, da es keine Nullterminierung gibt. Wenn Sie versuchen, das Array zu drucken, würden Sie Ihre Zeichen gefolgt von einer Reihe von nicht lesbaren Zeichen erhalten. Ich hinterlasse diese Antwort jedoch hier als Community-Wiki für die Nachwelt.

char members[255] = { 0 };

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; sind es weniger, werden die restlichen Mitglieder mit 0 initialisiert.

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

  • Das hängt davon ab, wie Sie “leer” definieren. Das Zeichen mit dem Wert 0 ist kein für Menschen lesbares Zeichen und das Array von Zeichen befindet sich in einem bekannten Zustand. Das würde ich für leer halten. Es macht auch genau dasselbe wie memset (wenn meine Erinnerung an memset richtig ist – es ist zu lange her, seit ich C verwendet habe).

    – Thomas Owens

    13. Oktober 2009 um 11:04 Uhr

Benutzeravatar von John Conde
John Conde

Verwenden bzero(array name, no.of bytes to be cleared);

  • Das hängt davon ab, wie Sie “leer” definieren. Das Zeichen mit dem Wert 0 ist kein für Menschen lesbares Zeichen und das Array von Zeichen befindet sich in einem bekannten Zustand. Das würde ich für leer halten. Es macht auch genau dasselbe wie memset (wenn meine Erinnerung an memset richtig ist – es ist zu lange her, seit ich C verwendet habe).

    – Thomas Owens

    13. Oktober 2009 um 11:04 Uhr

Benutzeravatar von starblue
sternenblau

Ein Array als solches kann man nicht leeren, es enthält immer die gleiche Menge an Daten.

In einem größeren Kontext können die Daten im Array eine leere Liste von Elementen darstellen, aber das muss zusätzlich zum Array definiert werden. Die gebräuchlichste Art, dies zu tun, besteht darin, gültige Elemente zu zählen (siehe die Antwort von pmg) oder Zeichenfolgen 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.

1421420cookie-checkWie leert man ein Char-Array?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy