Der beste Weg, um zu überprüfen, ob ein Zeichen-Array leer ist

Lesezeit: 3 Minuten

Was ist der zuverlässigste Weg, um zu überprüfen, ob ein Zeichenarray leer ist?

char text[50];

if(strlen(text) == 0) {}

oder

if(text[0] == '\0') {}

oder muss ich tun

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

Was ist der effizienteste Weg, dies zu tun?

  • Sie fragen sich also, ob Sie auf null testen müssen oder ob Sie die Zeichenfolge nur auf 0 setzen und dann auf 0 testen müssen?

    – Jeremy L

    25. November 2009 um 0:52 Uhr

  • Ja, ich war mir nicht sicher, ob ich einen String auf NULL testen könnte, wenn ich ihn einfach deklarieren und vorher nichts damit machen würde.

    – ZPS

    28. November 2009 um 5:45 Uhr

Benutzeravatar von bbum
bum

Angesichts dieses Codes:

char text[50];
if(strlen(text) == 0) {}

Gefolgt von einer Frage zu diesem Code:

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

Ich rieche Verwirrung. Konkret in diesem Fall:

char text[50];
if(strlen(text) == 0) {}

… Die Inhalte von text[] wird nicht initialisiert und undefiniert sein. Daher, strlen(text) gibt ein undefiniertes Ergebnis zurück.

Der einfachste/schnellste Weg, um sicherzustellen, dass ein C-String mit dem leeren String initialisiert wird, besteht darin, einfach das erste Byte auf 0 zu setzen.

char text[50];
text[0] = 0;

Ab dann beides strlen(text) und die sehr-schnell-aber-nicht-so-geradlinig (text[0] == 0) Tests erkennen beide die leere Zeichenfolge.

  • Ich habe das schlecht strukturiert, ich meinte für das memset(text, 0, sizeof(text)); unmittelbar nach char text kommen[50]; weil ich nicht sicher war, ob es eine schlechte Angewohnheit war, ein char-Array zu löschen, bevor ihm etwas zugewiesen wurde.

    – ZPS

    25. November 2009 um 0:24 Uhr

  • Es ist sicherlich eine schlechte Idee, ein Array zu strlen, bevor es zugewiesen wird – strlen wird durch den Speicher vorrücken, bis es ein 0-Byte erreicht, was weit über das Ende des Arrays hinausgehen kann.

    – Graem Perrow

    25. November 2009 um 1:22 Uhr

Hängt davon ab, ob Ihr Array eine nullterminierte Zeichenfolge enthält oder nicht. Wenn ja, dann

if(text[0] == '\0') {}

sollte ausreichen.

Edit: Eine andere Methode wäre …

if (strcmp(text, "") == 0)

was möglicherweise weniger effizient ist, aber Ihre Absicht klar zum Ausdruck bringt.

  • bei mir funktioniert folgendes if(text[0]==”){falsch zurückgeben;} wahr zurückgeben;

    – Amandeep Rohila

    9. Dezember 2021 um 12:27 Uhr


Dies funktioniert, um herauszufinden, ob ein Zeichenarray leer ist. Es ist wahrscheinlich auch das schnellste.

if(text[0] == '\0') {}

Das geht auch schnell, wenn die text Array ist leer. Wenn es Zeichen enthält, müssen zuerst alle darin enthaltenen Zeichen gezählt werden.

if(strlen(text) == 0) {}

  • Verwenden Sie strlen nicht, um zu testen, ob ein Cstring leer ist. Es ist kein konstanter Zeitbetrieb.

    – Thomas Eding

    13. Dezember 2012 um 22:34 Uhr

  • Was ich in der Antwort erkläre.

    – Peter Stuifzand

    24. Dezember 2012 um 14:04 Uhr

Die zweite Methode wäre mit ziemlicher Sicherheit der schnellste Weg, um zu testen, ob eine nullterminierte Zeichenfolge leer ist, da sie einen Lesevorgang und einen Vergleich umfasst. An diesem Ansatz ist in diesem Fall sicherlich nichts auszusetzen, also können Sie ihn genauso gut verwenden.

Die dritte Methode prüft nicht, ob ein Zeichenarray leer ist; es stellt sicher, dass ein Zeichenarray leer ist.

Der zweite ist am schnellsten. Verwenden strlen wird in der Nähe sein wenn der String ist zwar leer, aber strlen wird immer durch jedes Zeichen der Zeichenfolge iterieren, also wenn es so ist nicht leer, wird es viel mehr Arbeit leisten, als Sie brauchen.

Wie James erwähnt hat, löscht die dritte Option den String vor der Überprüfung, sodass die Überprüfung immer erfolgreich ist, aber bedeutungslos ist.

Benutzeravatar von Edwin Pratt
Edwin Pratt

if (text[0] == '\0')
{
    /* Code... */
}

Verwenden Sie dies, wenn Sie für Mikrocontroller mit wenig Platz auf Flash und/oder RAM codieren. Sie werden verschwenden viel mehr Blitz mit strlen als das erste Byte zu prüfen.

Das obige Beispiel ist das schnellste und es ist weniger Berechnung erforderlich.

Benutzeravatar von fja0568
fja0568

if (!*text) {}  

Das obige dereferenziert den Zeiger ‘text’ und prüft, ob er Null ist. Alternative:

if (*text == 0) {} 

1416680cookie-checkDer beste Weg, um zu überprüfen, ob ein Zeichen-Array leer ist

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

Privacy policy