Wie repräsentiert man das leere Zeichen?

79

Ich schreibe gerade ein kleines Programm, aber beim Kompilieren wird dieser Fehler immer wieder angezeigt

Fehler: leere Zeichenkonstante

Mir ist klar, dass ich versuche, ein gültiges Zeichen durch ein leeres Leerzeichen zu ersetzen, c[i]=''aber ich konnte keinen anderen Weg finden, es darzustellen.

BartoszKP
quelle
Es gibt keinen "leeren Raum" (falsche Terminologie), obwohl möglicherweise eine leere Zeichenfolge vorhanden ist. Möchten Sie durch c[i]ein Leerzeichen ersetzen oder möchten Sie dieses Zeichen aus dem Array "entfernen", wie Sie es in einem Editor tun würden, wenn Sie die Rücktaste drücken (dh möchten Sie die Zeichen c [i-1] und c [)? i + 1] nach der Operation benachbart werden)?
Lorenzo Donati - Codidact.com
1
Wenn Sie Zeichenfolgen verstehen, können Sie zum Zeitpunkt der Deklaration eine char c[5] = "";leere Zeichenfolge zuweisen , diese char c = '';ist jedoch nicht gültig, wie unten in 6 Antworten erläutert.
Grijesh Chauhan

Antworten:

123

Sie können verwenden c[i]= '\0'oder einfach c[i] = (char) 0.

Das Null- / Leerzeichen ist einfach ein Wert von Null, kann aber auch als Zeichen mit einer maskierten Null dargestellt werden.

leidenschaftlich
quelle
11
Ja, und es gibt kein "leeres Zeichen". '\0'ist das Nullzeichen, das nichts damit zu tun hat NULL; Das Nullzeichen ist einfach ein Zeichen mit 0 als numerischem Code.
Lorenzo Donati - Codidact.com
@ LorenzoDonati Ich habe es als Nullzeichen bezeichnet, das leere Zeichen diente nur dazu, die Terminologie von OP zu verwenden. Ich habe das auch in meiner Bearbeitung klargestellt. Als Chux-Notizen ist NULL nicht sehr gut für Nicht-Zeiger-Referenzgeschäfte, daher habe ich diese Notiz auch gemacht.
leidenschaftlicher
1
@LorenzoDonati Ja, ich habe beschlossen, es zu entfernen, da es dieser Antwort nichts hinzufügt und für die vorliegende Diskussion nicht im Zusammenhang zu stehen scheint.
leidenschaftlicher
@ LorenzoDonati Nicht null charsollte es nul char Single sein l.
Grijesh Chauhan
2
Es gibt kein leeres Zeichen. Das Nullzeichen als leeres Zeichen zu bezeichnen, ist einfach falsch.
Christoffer Hammarström
27

Sie können "kein Zeichen" nicht in einem Zeichen speichern - es macht keinen Sinn.

Alternativ können Sie ein Zeichen speichern, das für Sie eine besondere Bedeutung hat - z. B. null Zeichen '\0'- und dies speziell behandeln.

Occulus
quelle
4
Ich denke, dies ist eine viel bessere Antwort als die akzeptierte, die Nullzeichen und Leerzeichen verwechselt. Als Analogie ist es so, als ob Sie nicht sagen können, dass Sie kein int deklarieren und 'no number' speichern können - Sie müssen einen Wert speichern .
Simonwo
3
Sie können eine Nullzeichenfolge haben, ""da eine Zeichenfolge eine Folge von null oder mehr Zeichen ist, ein Zeichen jedoch genau ein Wert ist - nicht null und nicht mehr.
Simonwo
11

Das Leerzeichen wäre ' '. Wenn Sie nach Null suchen, wäre das '\0'.

Claudiu
quelle
9

Ja, c[i]=''ist kein gültiger Code. Wir klammern die Zeichenkonstante zwischen ' ', z . B. c[i] = 'A';char A. aber du schreibst kein Zeichen dazwischen ''.

Leerer Speicherplatz ist nichts anderes als angenommen, wenn Sie Speicherplatz zuweisen möchten, gehen Sie wie folgt vor:

c[i] = ' ';
//      ^  space 

Wenn Sie zugewiesen werden nul charmöchten, tun Sie Folgendes:

c[i] = '\0';
//       ^ null symbol 

Beispiel: Angenommen, c[]eine Zeichenfolge (kein \0terminiertes Zeichenarray), wenn Sie eine Zeichenfolge haben. zum Beispiel:

char c[10] = {'a', '2', 'c', '\0'};

Und Sie ersetzen das zweite Zeichen durch Leerzeichen :

c[1] = ' ';

und wenn Sie es mit printf wie folgt drucken:

printf("\n c: %s", c);

dann wäre die Ausgabe:

  c:  a  c
//      ^ space printed 

Und Sie ersetzen das zweite Zeichen durch '\ 0' :

c[1] = '\0';

dann wäre die Ausgabe:

  c:  a

weil Zeichenfolge mit beendet \0.

Grijesh Chauhan
quelle
Was ist, wenn wir nach '\ 0' einige Zeichen haben? Ich meine, nehmen wir an, wir möchten ein Zeichen in der Zeichenfolge entfernen, z. B. "sample" remove m. Gibt es nicht nur eine Möglichkeit, es durch ein hypothetisches leeres Zeichen zu ersetzen, anstatt es durch eine Verschiebung des Zeichens nach links zu entfernen?
Himanshu Poddar
5

Es gibt kein "leeres Zeichen" ''.

Wenn Sie ein Leerzeichen benötigen, kann dieses als Leerzeichen c[i] = ' 'oder als oktales ASCII-Äquivalent dargestellt werden : c[i] = '\040'. Wenn Sie einen NUL-Charakter benötigen, ist das c[i] = '\0'.

ausführlich
quelle
4

Um die Tatsache darzustellen, dass der Wert nicht vorhanden ist, haben Sie zwei Möglichkeiten:

1) Wenn der gesamte charBereich aussagekräftig ist und Sie keinen Wert reservieren können, verwenden Sie char*anstelle von char:

char** c = new char*[N];
c[0] = NULL; // no character
*c[1] = ' '; // ordinary character
*c[2] = 'a'; // ordinary character
*c[3] = '\0' // zero-code character

Dann haben Sie c[i] == NULLfür, wenn Zeichen nicht vorhanden ist und ansonsten *c[i]für gewöhnliche Zeichen.

2) Wenn Sie einige Werte nicht benötigen, die in dargestellt werden können, charreservieren Sie einen, um anzuzeigen, dass der Wert nicht vorhanden ist, z. B. das '\0'Zeichen.

char* c = new char[N];
c[0] = '\0'; // no character
c[1] = ' '; // ordinary character
c[2] = 'a'; // ordinary character

Dann haben Sie c[i] == '\0'für, wenn Zeichen nicht vorhanden ist und gewöhnliche Zeichen sonst.

BartoszKP
quelle
3
Die Frage ist mit c markiert , nicht mit c ++
Spikatrix
@CoolGuy Guter Punkt, du hast recht. Der Punkt der Antwort bleibt jedoch bestehen und abstrahiert von der Art und Weise, wie die Speicherzuweisung erfolgt.
BartoszKP
4

Es gibt zwei Möglichkeiten, dieselbe Anweisung auszuführen, dh eine leere Zeichenfolge. Die erste Möglichkeit besteht darin, eine leere Zeichenfolge im statischen Speicher zuzuweisen:

char* my_variable = "";

oder, wenn Sie explizit sein möchten:

char my_variable = '\0';

Der oben angegebene Weg gilt nur für einen Charakter. Und der zweite Weg:

#include <string.h>
char* my_variable = strdup("");

Vergessen Sie nicht , verwenden free () mit diesem einen , weil strdup () Verwendung malloc innen.

Nick Cuevas
quelle
2

Es kann nützlich sein, eine Null in einer Zeichenfolge zuzuweisen, anstatt einen Index explizit zum Nullzeichen zu machen '\0'. Ich habe dies zum Testen von Funktionen verwendet, die Zeichenfolgen verarbeiten, um sicherzustellen, dass sie innerhalb der entsprechenden Grenzen bleiben.

Mit:

char test_src[] = "fuu\0foo";

Dadurch wird ein Array der Größe 8 mit folgenden Werten erstellt:

{'f', 'u', 'u', '\0', 'f', 'o', 'o', '\0'}
Kyle s
quelle
0

String before = EMPTY_SPACE+TAB+"word"+TAB+EMPTY_SPACE;

Wobei EMPTY_SPACE = "" (dies ist String) TAB = '\ t' (dies ist Character)

String after = before.replaceAll(" ", "").replace('\t', '\0');

bedeutet nach = "Wort"

Stefanidis
quelle