2013-03-18 25 views
26

Sto scrivendo un programma molto piccolo in C che deve controllare se una determinata stringa è vuota. Per il bene di questa domanda, ho semplificato il mio codice:Come verificare se la stringa C è vuota

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

voglio il programma per arrestare il ciclo se l'utente appena preme Invio senza inserire nulla.

Grazie.

EDIT:

Ho un piccolo problema qui. Quando clicco invio senza inserire nulla nel terminale, il cursore salta semplicemente alla riga successiva. C'è qualcuno che deve semplicemente non inviare nulla invece di spostarlo alla riga successiva?

EDIT:

ho trovato che l'aggiunta di [^ \ n] in scanf mi permette di entrare nulla e ancora si sottopone. Tuttavia, quando scrivo qualcosa, viene eseguito ancora una volta e quindi si chiude il ciclo da solo. Ecco il codice aggiornato:

int main() { 
char url[63] = {'\0'}; 
do { 
    printf("Enter a URL: "); 
    scanf("%[^\n]s", url); 
} while (url[0] != '\0'); 

return(0); 
} 
+0

Si prega di leggere la documentazione (in questo caso per 'scanf') * prima * domande annuncio a SO. –

risposta

34

Dal stringhe C-stile sono sempre terminate con il carattere null (\0), è possibile verificare se la stringa è vuota scrivendo

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

In alternativa, è possibile utilizzare la funzione strcmp, che è overkill ma potrebbe essere più facile da leggere:

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

Si noti che strcmp restituisce un valore diverso da zero se le stringhe sono diverse e 0 se sono uguali, quindi questo ciclo continua fino a quando la stringa non è vuota.

Spero che questo aiuti!

+1

while (url [0]! = '\ 0'); continuerà il ciclo finché la stringa NON è vuota. Volete: while (url [0] == '\ 0'); – andrewhl

+1

Oppure '! * Url' per essere fantastico. – bambams

2

si può provare in questo modo: -

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

Nel tuo caso può essere come: -

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

;

+0

Questo non funziona ancora se l'utente non inserisce nulla. Il cursore salta semplicemente alla riga successiva invece di non inviare nulla. – codedude

8

Se si desidera controllare se una stringa è vuota:

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

strlen(url)

Restituisce la lunghezza della stringa. Conta tutti i caratteri fino a quando non viene trovato un byte null. Nel tuo caso, controllare contro 0.

o semplicemente controllare manualmente con:

*url == '\0' 
+0

Questo non funziona ancora se l'utente non inserisce nulla. Il cursore salta semplicemente alla riga successiva invece di non inviare nulla. – codedude

6

Se il primo carattere sembra essere '\0', allora si ha una stringa vuota.

Questo è ciò che si dovrebbe fare:

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

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

Ciò non funziona ancora se l'utente non inserisce nulla. Il cursore salta semplicemente alla riga successiva invece di non inviare nulla. – codedude

+0

Che ne dici di questo? (Aggiornato) –

+0

Non proprio. Quando l'utente fa semplicemente clic su Invio invece di immettere dati, il ciclo dovrebbe smettere di funzionare. In questo momento, tutto fa saltare alla riga successiva. – codedude

1

È possibile controllare il valore di ritorno da scanf. Questo codice rimarrà lì finché non riceverà una stringa.

int a; 

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

} while (a <= 0); 
3

Generalmente parlando, si sta andando ad avere un momento difficile ottenere una stringa vuota qui, considerando %s ignora gli spazi bianchi (spazi, tabulazioni, a capo) ... ma a prescindere, scanf() in realtà restituisce il numero di successo partite ...

Dalla pagina man:

il numero di elementi di input abbinate e assegnati con successo, che possono essere meno di previsto, o addirittura pari a zero in caso di un guasto di corrispondenza presto.

quindi se in qualche modo sono riusciti a cavarsela con una stringa vuota (ctrl+z per esempio) è sufficiente controllare il risultato della restituzione.

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

nota si controlla meno di quanto nell'esempio ho dato, si sarebbe tornare -1, ancora una volta in dettaglio nella pagina man:

Il valore EOF viene restituito se la fine del l'input viene raggiunto prima che si verifichi la prima conversione riuscita o un errore corrispondente. EOF viene anche restituito se si verifica un errore di lettura, nel qual caso viene impostato l'indicatore di errore per il flusso (vedi ferror (3)) e viene impostato errno per indicare l'errore.

2

Prima sostituire il scanf() con fgets() ...

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

Con strtok(), che può essere fatto in una sola riga: "se (strtok (s," \ t ") == NULLO)". Per esempio:

#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; 
} 
+0

Se ho capito bene, questo controlla lo spazio bianco e non una stringa vuota. – Jonathan

Problemi correlati