Hoe te controleren of de C-tekenreeks leeg is

Ik schrijf een heel klein programma in C dat moet controleren of een bepaalde string leeg is. Omwille van deze vraag heb ik mijn code vereenvoudigd:

#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);
}

Ik wil dat het programma stopt met herhalen als de gebruiker op enter drukt zonder iets in te voeren.


Antwoord 1, autoriteit 100%

Aangezien C-stijl strings altijd eindigen met het null-teken (\0), kunt u controleren of de string leeg is door te schrijven

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

U kunt ook de functie strcmpgebruiken, wat overdreven is, maar misschien gemakkelijker te lezen is:

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

Merk op dat strcmpeen niet-nulwaarde retourneert als de tekenreeksen verschillend zijn en 0 als ze hetzelfde zijn, dus deze lus blijft herhalen totdat de tekenreeks niet-leeg is.

Hopelijk helpt dit!


Antwoord 2, autoriteit 28%

Als je wilt controleren of een tekenreeks leeg is:

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

Antwoord 3, autoriteit 9%

Als het eerste teken '\0'is, heb je een lege tekenreeks.

Dit is wat u moet doen:

do {
    /* 
    *   Resetting first character before getting input.
    */
    url[0] = '\0';
    // code
} while (url[0] != '\0');

Antwoord 4, autoriteit 5%

Normaal gesproken zal het moeilijk zijn om hier een lege string te krijgen, aangezien %switruimte negeert (spaties, tabs, nieuwe regels)… maar hoe dan ook, scanf()geeft feitelijk het aantal succesvolle overeenkomsten terug…

Van de man-pagina:

het aantal invoeritems dat met succes is afgestemd en toegewezen, dat minder kan zijn dan voorzien, of zelfs nul in het geval van een vroegtijdige afstemmingsfout.

dus als ze er op de een of andere manier in slaagden rond te komen met een lege string (bijvoorbeeld ctrl+z), dan kun je gewoon het retourresultaat controleren.

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

Let op: je hoeft minder aan te vinken dan omdat je in het voorbeeld dat ik gaf, -1terug zou krijgen, opnieuw gedetailleerd in de man-pagina:

De waarde EOF wordt geretourneerd als het einde van de invoer wordt bereikt voordat de eerste succesvolle conversie of een overeenkomende fout optreedt. EOF wordt ook geretourneerd als er een leesfout optreedt, in welk geval de foutindicator voor de stream (zie ferror (3)) is ingesteld en errno is ingesteld, geeft de fout aan.


Antwoord 5, autoriteit 4%

strlen(url)

Retourneert de lengte van de tekenreeks. Het telt alle tekens totdat een null-byte wordt gevonden. In jouw geval, controleer het tegen 0.

Of controleer het gewoon handmatig met:

*url == '\0'

Antwoord 6, autoriteit 4%

Je kunt de retourwaarde controleren via scanf. Deze code blijft daar staan totdat hij een string ontvangt.

int a;
do {
  // other code
  a = scanf("%s", url);
} while (a <= 0);

Antwoord 7, autoriteit 3%

Je kunt het als volgt proberen:-

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

In jouw geval kan het zijn als:-

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

;


Antwoord 8, autoriteit 3%

Vervang eerst de scanf()door fgets()

do {
    if (!fgets(url, sizeof url, stdin)) /* error */;
    /* ... */
} while (*url != '\n');

Antwoord 9, autoriteit 3%

De kortste manier om dat te doen is:

do {
    // Something
} while (*url);

Kortom, *urlretourneert de char op de eerste positie in de array; aangezien C-tekenreeksen op nul eindigen, zal als de tekenreeks leeg is, de eerste positie het teken '\0'zijn, waarvan de ASCII-waarde 0is; aangezien C logische statements elke nulwaarde behandelen als false, zal deze lus doorgaan zolang de eerste positie van de string niet-null is, dat wil zeggen, zolang de string niet leeg is.

Aanbevolen metingen als u dit beter wilt begrijpen:


Antwoord 10

Ik heb deze macro opgeschreven

#define IS_EMPTY_STR(X) ( (1 / (sizeof(X[0]) == 1))/*type check*/ && !(X[0])/*content check*/)

zo zou het zijn

while (! IS_EMPTY_STR(url));

Het voordeel van deze macro is dat hij typeveilig is. Je krijgt een compilatiefout als je iets anders invoert dan een verwijzing naar char.


Antwoord 11

Het is heel eenvoudig.
controleer op string-lege voorwaarde in while-voorwaarde.

  1. Je kunt de strlen-functie gebruiken om de lengte van de string te controleren.

    #include<stdio.h>
    #include <string.h>   
    int main()
    {
        char url[63] = {'\0'};
        do
        {
            printf("Enter a URL: ");
            scanf("%s", url);
            printf("%s", url);
        } while (strlen(url)<=0);
        return(0);
    }
    
  2. controleer het eerste teken is ‘\0’

    #include <stdio.h>    
    #include <string.h>
    int main()
    {        
        char url[63] = {'\0'};
        do
        {
            printf("Enter a URL: ");
            scanf("%s", url);
            printf("%s", url);
        } while (url[0]=='\0');
        return(0);
    }
    

Voor uw referentie:

C-arrays:
https://www.javatpoint.com/c-array
https://scholarsoul.com/arrays-in-c/

C-snaren:
https://www.programiz.com/c-programming/c-strings
https://scholarsoul.com/string-in-c/
https://en.wikipedia.org/wiki/c_string_handling


Antwoord 12

Met Strtok () kan het in slechts één regel worden gedaan: “Als (STRTOK (S,” \ t “) == null)”.
Bijvoorbeeld:

#include <stdio.h>
#include <string.h>
int is_whitespace(char *s) {
    if (strtok(s," \t")==NULL) {
        return 1;
    } else {
        return 0;
    }
}
void demo(void) {
    char s1[128];
    char s2[128];
    strcpy(s1,"   abc  \t ");
    strcpy(s2,"    \t   ");
    printf("s1 = \"%s\"\n", s1);
    printf("s2 = \"%s\"\n", s2);
    printf("is_whitespace(s1)=%d\n",is_whitespace(s1));
    printf("is_whitespace(s2)=%d\n",is_whitespace(s2));
}
int main() {
    char url[63] = {'\0'};
    do {
        printf("Enter a URL: ");
        scanf("%s", url);
        printf("url='%s'\n", url);
    } while (is_whitespace(url));
    return 0;
}

Other episodes