So überprüfen Sie, ob der C-String leer ist

Lesezeit: 4 Minuten

Benutzeravatar von codeude
Kodierung

Ich schreibe ein sehr kleines Programm in C, das prüfen muss, ob eine bestimmte Zeichenfolge leer ist. Für diese Frage habe ich meinen Code vereinfacht:

#include <stdio.h>
#include <string>

int main() {
  char url[63] = {'\0'};
  do {
    printf("Enter a URL: ");
    scanf("%s", url);
    printf("%s", url);
  } while (/*what should I put in here?*/);

  return(0);
}

Ich möchte, dass das Programm die Schleife beendet, wenn der Benutzer nur die Eingabetaste drückt, ohne etwas einzugeben.

Da Strings im C-Stil immer mit dem Nullzeichen abgeschlossen werden (\0), können Sie durch Schreiben prüfen, ob der String leer ist

do {
   ...
} while (url[0] != '\0');

Alternativ können Sie auch die verwenden strcmp Funktion, die übertrieben ist, aber möglicherweise einfacher zu lesen ist:

do {
   ...
} while (strcmp(url, ""));

Beachten Sie, dass strcmp gibt einen Wert ungleich Null zurück, wenn die Strings unterschiedlich sind, und 0, wenn sie gleich sind, sodass diese Schleife so lange wiederholt wird, bis der String nicht leer ist.

Hoffe das hilft!

  • während (URL[0] != ‘\0’); wird die Schleife fortsetzen, solange die Zeichenfolge NICHT leer ist. Sie wollen: während (url[0] == ‘\0’);

    – andrewhl

    21. Januar 2014 um 17:40 Uhr

  • Oder !*url unglaublich sein.

    – Bambus

    17. September 2014 um 19:03 Uhr

  • Wie wäre es mit strlen(url) == 0 ? ?

    – Buchhalter م

    14. April 2019 um 5:18 Uhr

  • Ich glaube strlen(url) == 0 ist, ohne Optimierungen, da weniger effizient strlen hat eine lineare Komplexität in der Länge der Zeichenfolge (es muss iterieren, bis es ein Nullzeichen sieht). Die anderen Ansätze haben eine konstante Komplexität, da sie nur ein Zeichen lesen. Vielleicht optimiert der Compiler strlen(url) == 0 obwohl.

    – Sam Marinelli

    20. Juli 2021 um 5:31 Uhr

Benutzeravatar von nabroyan
nabroyan

Wenn Sie überprüfen möchten, ob eine Zeichenfolge leer ist:

if (str[0] == '\0')
{
    // your code here
}

Benutzeravatar von user123
Benutzer123

Wenn das erste Zeichen zufällig ist '\0'dann hast du einen leeren String.

Das sollten Sie tun:

do {
    /* 
    *   Resetting first character before getting input.
    */
    url[0] = '\0';

    // code
} while (url[0] != '\0');

  • Dies funktioniert immer noch nicht, wenn der Benutzer nichts eingibt. Der Cursor springt einfach in die nächste Zeile, anstatt nichts zu senden.

    – Codierung

    18. März 2013 um 22:01 Uhr

  • Nicht wirklich. Wenn der Benutzer nur auf die Eingabetaste klickt, anstatt Daten einzugeben, sollte die Schleife nicht mehr ausgeführt werden. Im Moment springt es nur in die nächste Zeile.

    – Codierung

    18. März 2013 um 22:12 Uhr

  • Vielleicht gibt es eine Möglichkeit zu überprüfen, ob der Benutzer gerade die Eingabetaste gedrückt hat?

    – Codierung

    18. März 2013 um 22:13 Uhr

  • Versuchen Sie es mit getchar(). Offenbar, getchar() ermöglicht es Ihnen zu erkennen, wenn eine Taste gedrückt wird, aber Sie müssten das zurückgegebene Zeichen (technisch gesehen int) manuell drucken, so dass es ziemlich chaotisch werden würde.

    – Benutzer123

    18. März 2013 um 22:22 Uhr


  • Oh, das ist cool. Ich denke, das Zurücksetzen des ersten Zeichens jedes Mal kann das lösen (wie ich es nach der Bearbeitung hier getan habe). Auf diese Weise bleibt es gleich, wenn keine Eingabe erfolgt '\0' und die Schleife muss dann beendet werden.

    – Benutzer123

    18. März 2013 um 22:25 Uhr


Mikes Benutzeravatar
Mike

Typischerweise wird es Ihnen schwer fallen, hier eine leere Zeichenfolge zu bekommen, wenn man bedenkt %s ignoriert Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche) … aber egal, scanf() Gibt tatsächlich die Anzahl der erfolgreichen Übereinstimmungen zurück …

Aus der Manpage:

die Anzahl der erfolgreich abgeglichenen und zugewiesenen Eingabeelemente, die kleiner sein kann als vorgesehen, oder sogar null im Falle eines frühen Abgleichsfehlers.

Wenn sie es also irgendwie geschafft haben, mit einer leeren Zeichenfolge (ctrl+z zum Beispiel) können Sie einfach das Rückgabeergebnis überprüfen.

int count = 0;
do {
  ...
  count = scanf("%62s", url);  // You should check return values and limit the 
                               // input length
  ...
} while (count <= 0)

Beachten Sie, dass Sie weniger als überprüfen müssen, da Sie in dem Beispiel, das ich gegeben habe, zurückkommen würden -1erneut detailliert in der Manpage:

Der Wert EOF wird zurückgegeben, wenn das Ende der Eingabe erreicht wird, bevor entweder die erste erfolgreiche Konvertierung oder ein Übereinstimmungsfehler auftritt. EOF wird auch zurückgegeben, wenn ein Lesefehler auftritt. In diesem Fall wird der Fehlerindikator für den Stream (siehe ferror(3)) gesetzt, und errno wird gesetzt, um den Fehler anzuzeigen.

strlen(url)

Gibt die Länge der Zeichenfolge zurück. Es zählt alle Zeichen, bis ein Null-Byte gefunden wird. Überprüfen Sie es in Ihrem Fall gegen 0.

Oder überprüfen Sie es einfach manuell mit:

*url == '\0'

  • Dies funktioniert immer noch nicht, wenn der Benutzer nichts eingibt. Der Cursor springt einfach in die nächste Zeile, anstatt nichts zu senden.

    – Codierung

    18. März 2013 um 22:01 Uhr

Benutzeravatar von squiguy
squiguy

Sie können den Rückgabewert von überprüfen scanf. Dieser Code bleibt einfach dort, bis er eine Zeichenfolge empfängt.

int a;

do {
  // other code
  a = scanf("%s", url);

} while (a <= 0);

  • Dies funktioniert immer noch nicht, wenn der Benutzer nichts eingibt. Der Cursor springt einfach in die nächste Zeile, anstatt nichts zu senden.

    – Codierung

    18. März 2013 um 22:01 Uhr

Sie können es so versuchen: –

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

In Ihrem Fall kann es so sein: –

do {
   ...
} while (url[0] != '\0')

;

  • Dies funktioniert immer noch nicht, wenn der Benutzer nichts eingibt. Der Cursor springt einfach in die nächste Zeile, anstatt nichts zu senden.

    – Codierung

    18. März 2013 um 22:00 Uhr

1417370cookie-checkSo überprüfen Sie, ob der C-String leer ist

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

Privacy policy