2010-11-02 29 views
6

Ho ottenuto un progetto in C++ che ho bisogno di modificare. Questa è una dichiarazione di variabile:Controlla se la stringa è vuota

LPSTR hwndTitleValue = (LPSTR)GlobalAlloc(GPTR,(sizeof(CHAR) * hwndTitleSize)); 

Come verificare se questa stringa è vuota?

Ho provato semplicemente con if(hwndTitleValue == "") ma restituisce sempre false. Come verificare se questa stringa è vuota?

EDIT

Ho anche bisogno di controllare se il file è allegato. Ecco il codice del file:

// Attachment 
    OFSTRUCT ofstruct; 
    HFILE hFile = OpenFile(mmsHandle->hTemporalFileName , &ofstruct , OF_READ); 
    DWORD hFileSize = GetFileSize((HANDLE) hFile , NULL); 
    LPSTR hFileBuffer = (LPSTR)GlobalAlloc(GPTR, sizeof(CHAR) * hFileSize); 
    DWORD hFileSizeReaded = 0; 
    ReadFile((HANDLE) hFile , hFileBuffer, hFileSize, &hFileSizeReaded, NULL); 
    CloseHandle((HANDLE) hFile); 

Come controllare se hFile è vuota?

+1

Quale stringa? btw LPRSTR, GPTR e CHAR non sono tipi C++ standard. –

+0

Devo controllare se hwndTitleValue è vuoto. –

+0

GlobalAlloc restituisce una MANIGLIA, non puoi convertirla in una stringa come quella – Kra

risposta

11

Credo che hwndTitleValue sia un puntatore, almeno in Notazione ungherese sarebbe. Il tuo metodo è l'allocazione di un array di byte (una stringa ANSI C), quindi il modo migliore per farlo sarebbe

#include <string.h> 
// ... other includes ... 

int isEmpty(LPSTR string) 
{ 
    if (string != NULL) 
    { 
     // Use not on the result below because it returns 0 when the strings are equal, 
     // and we want TRUE (1). 
     return !strcmp(string, ""); 
    } 

    return FALSE; 
} 

È possibile, tuttavia, incidere il metodo di cui sopra e non utilizzare strcmp:

#include <string.h> 
// ... other includes ... 

int isEmpty(LPSTR string) 
{ 
    // Using the tip from Maciej Hehl 
    return (string != NULL && string[0] == 0); 
} 

Una cosa da notare è che la stringa potrebbe non essere vuota ma riempita di spazio. Questo metodo ti dirà che la stringa ha dati (gli spazi sono dati!). Se devi tenere conto di stringhe piene di spazi, devi prima tagliarlo.


EDIT: Un'altra cosa da notare è che i metodi di cui sopra non tengono conto di puntatori NULL correttamente. Se il puntatore è nullo, isEmpty restituirà FALSE, che non è desiderato. Possiamo rimuovere il controllo NULL e quindi diventa responsabilità del chiamante, oppure possiamo definire che isEmpty restituisce le stringhe FALSE a NULL.

#include <string.h> 
// ... other includes ... 

int isEmpty(LPSTR string) 
{ 
    // Always return FALSE to NULL pointers. 
    if (string == NULL) return FALSE; 

    // Use not on the result below because it returns 0 when the strings are equal, 
    // and we want TRUE (1). 
    return !strcmp(string, ""); 

} 
+0

Se la stringa è NULL, questa funzione non restituisce nulla. –

+0

ma non vedo la connessione tra il codice e hwndTitleValue che utilizzo. Grazie! –

+0

Un'altra revisione, in cui ti sei sbarazzato dell'istruzione 'if' e hai semplicemente restituito' string! = NULL && string [0] = 0' e la risposta sarebbe stata perfetta :) –

2

GlobalAlloc() restituirà un blocco di memoria riempito con zeri (grazie a GPTR bandiera), non una stringa. Non ha senso controllare. Faresti meglio a controllare che il puntatore restituito non sia nullo.

Se questo non è abbastanza per voi un solo controllare

if (*hwndTitleValve == 0) { 
} 

Una stringa vuota valida memorizza un terminatore null proprio all'inizio.

+0

Vero, ma non risponde alla domanda. –

+0

@Graeme Perrow: Perché non si verifica una risposta? If (* str == 0) 'una risposta? – sharptooth

+1

Perché quella parte della risposta non c'era quando ho aggiunto il mio commento. –

3

Prima di tutto, questa non è una stringa. Non ancora. È solo un puntatore a un pezzo di memoria che a tutti gli effetti contiene spazzatura, ad esempio alcuni dati casuali.

Le stringhe in C sono puntatori a array di caratteri con terminazione zero. Quindi la tua stringa vuota "" è in realtà una matrice di un elemento con valore zero. Ma il tuo confronto è tra puntatori, quindi fallisce sempre.

+0

Non dovrebbe essere considerato vuoto alcun array di caratteri che inizi con un terminatore null, indipendentemente dalla lunghezza? – mikerobi

+0

Il blocco sarà riempito a zero grazie al flag 'GPTR'. – sharptooth

+0

Grazie, è stato un po 'di tempo da quando ho lavorato su Windows. –

2

La funzione GlobalAlloc solo alloca e restituisce un blocco di memoria e l'opzione GPTR azzera i byte di memoria allocata quindi si può utilizzare:

if (strlen(hwndTitleValve) == 0) 

assumendo una stringa ANSI. Si noti che questo sarebbe meglio etichettato come "C" e "Windows" piuttosto che C++.

+0

Questo è orribile. Questo scannerizzerà l'intera stringa che potrebbe potenzialmente essere una forma di veeeeery. – sharptooth

0

Trovo strano che il nome di una stringa inizi con hwnd (che è per gli handle di Windows), ma in ogni caso si può supporre che LPSTR sia la stessa cosa di char * e usare solo qualcosa come strlen per controllarne la lunghezza.

18

Il modo più semplice per verificare se una stringa è vuota è quello di vedere se il primo carattere è un byte nullo:

if(hwndTitleValue != NULL && hwndTitleValue[0] == '\0') { 
    // empty 
} 

È possibile utilizzare strlen o strcmp come in altre risposte, ma questo consente di risparmiare una chiamata di funzione .

+1

Questa è la risposta giusta. Dimentica 'strlen()'. 'strlen()' analizzerà l'intera stringa che può essere molto lunga. Se la stringa è lunga un personaggio di gazillion, scansionerà tutti. Controlla solo il primo carattere per rilevare una stringa vuota. – sharptooth

+0

funziona molto bene. Ho modificato la mia domanda e ora ho anche bisogno di verificare se il file esiste. Potresti controllare il file? Grazie mille! –

+0

Il controllo dell'esistenza del file è un problema completamente diverso. È meglio porre questa domanda separatamente o, meglio ancora, cercare StackOverflow. Questa domanda è stata probabilmente chiesta in precedenza. –

-1

se si vuole verificare se l'allocazione di memoria non è riuscita fare in questo modo:

HGLOBAL hwndTitleValue = GlobalAlloc (GPTR, (sizeof (char) * hwndTitleSize));

if (hwndTitleValue == NULL) return ALLOC_FAILED;

Non vedo il punto di lavorare con le stringhe qui.

Problemi correlati