Wie kann ich überprüfen, ob char*
Variable zeigt auf einen leeren String?
Wie kann ich überprüfen, ob die Variable char* auf eine leere Zeichenfolge zeigt?
An
Codemacher
Überprüfen Sie, ob das erste Zeichen ‘\0’ ist. Sie sollten wahrscheinlich auch überprüfen, ob Ihr Zeiger NULL ist.
char *c = "";
if ((c != NULL) && (c[0] == '\0')) {
printf("c is empty\n");
}
Sie könnten diese beiden Überprüfungen in eine Funktion einfügen, um sie bequem und einfach wiederverwendbar zu machen.
Bearbeiten: In der if-Anweisung kann so gelesen werden: “Wenn c nicht Null ist und das erste Zeichen des Zeichenarrays ‘c’ nicht ‘\0’ oder Null ist, dann …”.
Das &&
kombiniert einfach die beiden Bedingungen. Es ist im Grunde so, als würde man sagen:
if (c != NULL) { /* AND (or &&) */
if (c[0] == '\0') {
printf("c is empty\n");
}
}
Vielleicht möchten Sie sich ein gutes C-Programmierbuch besorgen, wenn Ihnen das nicht klar ist. Ich könnte ein Buch namens “The C Programming Language” empfehlen.
Die kürzeste Version, die der obigen entspricht, wäre:
if (c && !c[0]) {
printf("c is empty\n");
}
-
@Zack: Was
c && c[0]
meint? Kannst du es bitte erklären?– An
1. November 2011 um 18:15 Uhr
-
Persönlich würde ich die Prüfung auf einen NULL-Zeiger von der Prüfung auf einen leeren String trennen; die beiden sind nicht wirklich verwandt. “Portabler” ist wahrscheinlich nicht wirklich das, was Sie sagen wollten, da der gesamte Code, den Sie hier präsentieren, gültiges C (und auch C++) ist.
– Markieren Sie Lösegeld
1. November 2011 um 19:19 Uhr
-
Schreiben
c != NULL
statt nurc
bekommt Sie dinged, wenn ich den Code überprüfe, weil die beiden genau gleich sind (solangec
ist ein Zeiger) und die kürzere Form ist das Standard-C-Idiom. Nicht idiomatische Formen sollten nur verwendet werden, wenn Sie die Aufmerksamkeit eines menschlichen Lesers auf etwas Lustiges lenken möchten, aber hier passiert nichts Lustiges, also wird Idiom bevorzugt.– zol
1. November 2011 um 19:51 Uhr
-
Ein Zeichen kürzer als Ihre “kürzeste Version” wäre
if (c && !*c)
.– Markieren Sie Lösegeld
22. Februar 2016 um 13:22 Uhr
Meine bevorzugte Methode:
if (*ptr == 0) // empty string
Wahrscheinlich häufiger:
if (strlen(ptr) == 0) // empty string
-
Beachten Sie, dass die zweite, “häufigere” Möglichkeit auch unnötig langsamer ist.
– jpalecek
1. November 2011 um 17:58 Uhr
-
@jpalecek, die Langsamkeit spielt oft keine Rolle und
strlen
ist leichter zu verstehen, wenn Sie nicht an die erste Form gewöhnt sind.– Markieren Sie Lösegeld
1. November 2011 um 18:01 Uhr
-
@Adban, auf dieser Seite ist der beste Weg, jemandem zu danken, den Pfeil neben der Antwort zu drücken 🙂
– Markieren Sie Lösegeld
1. November 2011 um 19:16 Uhr
-
@MarkRansom: Du hast mich nichts gefragt hah! 🙂 nimm +1.
– An
1. November 2011 um 23:14 Uhr
-
@Romário die speziell gestellte Frage “zeigt auf eine leere Zeichenfolge”, das ist also die Frage, die ich beantwortet habe; ein Nullzeiger ist eine ganz andere Sache. Sie können einen Test für null mit den anderen kombinieren, die ich oben angegeben habe, und wenn Sie ihn an die erste Stelle setzen, werden die Kurzschlussregeln Sie davon abhalten, den Nullzeiger zu dereferenzieren.
if (ptr == nullptr || *ptr == 0)
– Markieren Sie Lösegeld
19. Juli 2016 um 14:00 Uhr
Überprüfen Sie den Zeiger auf NULL
und dann verwenden strlen
um zu sehen, ob es zurückkehrt 0
.
NULL
Scheck ist wichtig, weil bestanden NULL
Zeiger auf strlen
ruft ein Undefiniertes Verhalten.
Ein leerer String hat ein einzelnes Null-Byte. Also testen if (s[0] == (char)0)
if (!*ptr) { /* empty string */}
ähnlich
if (*ptr) { /* not empty */ }
-
@igraczech, hmm, das sollte für den Fall funktionieren char *str = “”; if (!*str) { printf(“leer\n”); }. Habe ich einen subtilen Fall übersehen?
– alwin
3. Dezember 2016 um 8:10 Uhr
-
Tut mir leid, du hast Recht – es war mein dummes C-Zeiger-Versehen. Ich hatte den Fall, wo str auf eine Adresse zeigte, die nur ‘\0’ enthielt. Der Zeiger (*str) war also nicht null, wo der Wert (Inhalt der Adresse, auf die str zeigt) null war.
– igraczech
5. Dezember 2016 um 14:29 Uhr
bhuwansahni
Ich würde es vorziehen, die strlen-Funktion zu verwenden, da Bibliotheksfunktionen am besten implementiert sind.
Also würde ich schreiben if(strlen(p)==0) //Leerer String
-
@igraczech, hmm, das sollte für den Fall funktionieren char *str = “”; if (!*str) { printf(“leer\n”); }. Habe ich einen subtilen Fall übersehen?
– alwin
3. Dezember 2016 um 8:10 Uhr
-
Tut mir leid, du hast Recht – es war mein dummes C-Zeiger-Versehen. Ich hatte den Fall, wo str auf eine Adresse zeigte, die nur ‘\0’ enthielt. Der Zeiger (*str) war also nicht null, wo der Wert (Inhalt der Adresse, auf die str zeigt) null war.
– igraczech
5. Dezember 2016 um 14:29 Uhr
ikm104
Gib es eine Chance:
Versuchen Sie, den String über die Funktion gets(string) abzurufen, und prüfen Sie dann die Bedingung als if(string[0] == ‘\0’)