2010-11-02 26 views
6

Tengo un proyecto en C++ que necesito editar. Esta es una declaración de variable:Compruebe si la cadena está vacía

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

¿Cómo comprobar si esta cadena está vacía?

Intenté simplemente con if(hwndTitleValue == "") pero siempre devuelve falso. ¿Cómo comprobar si esta cadena está vacía?

EDITAR

también tengo que comprobar si el archivo se adjunta. Aquí está el código del archivo:

// 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); 

cómo comprobar si hFile está vacía?

+1

¿Qué cadena? Por cierto, LPRSTR, GPTR y CHAR no son tipos estándar de C++. –

+0

Necesito comprobar si hwndTitleValue está vacío. –

+0

GlobalAlloc devuelve un MANIJA, no puede convertirlo en una cadena como esa – Kra

Respuesta

11

Creo que hwndTitleValue es un puntero, al menos en la notación húngara. Su método es la asignación de una matriz de bytes (una cadena ANSI C), por lo que la mejor manera de hacerlo sería

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

Puede, sin embargo, cortar el método anterior y no utilizar strcmp:

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

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

Una cosa a tener en cuenta es que la cadena puede no estar vacía pero llena de espacio. Este método le dirá que la cadena tiene datos (¡los espacios son datos!). Si necesita contabilizar cadenas llenas de espacios, primero tendrá que recortarla.


EDITAR: Otra cosa a tener en cuenta es que los métodos anteriores no dan cuenta de punteros NULL correctamente. Si el puntero es nulo, isEmpty devolverá FALSE, lo cual no es deseable. Podemos eliminar la verificación NULL y luego se convierte en responsabilidad de la persona que llama, o podemos definir que isEmpty devuelve FALSE en cadenas 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

Si la cadena es NULL, esta función no devuelve nada. –

+0

pero no veo conexión entre su código y hwndTitleValue que uso. ¡Gracias! –

+0

Una revisión más, donde se deshizo de la instrucción 'if' y simplemente devolvió' string! = NULL && string [0] = 0' y la respuesta sería perfecta :) –

2

GlobalAlloc() devolverá un bloque de memoria llena de ceros (gracias a GPTR bandera), no es una cadena. No tiene sentido verificar. Será mejor que verifique que el puntero devuelto no sea nulo.

Si eso no es suficiente para que un solo comprueba

if (*hwndTitleValve == 0) { 
} 

Una cadena vacía válida almacenará un terminador nulo desde el principio.

+0

Es cierto, pero no responde la pregunta. –

+0

@Graeme Perrow: ¿Por qué un cheque 'if (* str == 0)' no es una respuesta? – sharptooth

+1

Porque esa parte de la respuesta no estaba allí cuando agregué mi comentario. –

3

En primer lugar, esto no es una cadena. Aún no. Es solo un puntero a un pedazo de memoria que para todos los intentos y propósitos contiene basura, es decir, algunos datos aleatorios.

Las cadenas en C son punteros a terminaciones cerradas matrices de caracteres. Entonces, la cadena vacía "" es en realidad una matriz de un elemento con valor cero. Pero su comparación es entre punteros, por lo que siempre falla.

+0

¿No debería considerarse vacía cualquier matriz de caracteres que comience con el terminador nulo, independientemente de la longitud? – mikerobi

+0

El bloque se llenará de cero gracias al indicador 'GPTR'. – sharptooth

+0

Gracias, ha pasado un tiempo desde que trabajé en Windows. –

2

La función GlobalAlloc simplemente asigna y devuelve un bloque de memoria y la opción GPTR ceros los bytes de la memoria asignada por lo que sólo puede utilizar:

if (strlen(hwndTitleValve) == 0) 

asumiendo una cadena ANSI. Tenga en cuenta que esto se etiquetaría mejor como "C" y "Windows" en lugar de C++.

+0

Esto es horrible. Esto explorará toda la cadena que potencialmente puede ser veeeeery loong. – sharptooth

0

Me resulta extraño que un nombre de cadena empiece por hwnd (esto es para manejadores de ventanas), pero de todos modos puede suponer que LPSTR es lo mismo que char * y simplemente usar algo como strlen para verificar su longitud.

18

La forma más sencilla de comprobar si una cadena está vacía, es ver si el primer carácter es un byte nulo:

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

Usted puede utilizar strlen o strcmp como en otras respuestas, pero esto ahorra una llamada de función .

+1

Esta es la respuesta correcta. Olvídate de 'strlen()'. 'strlen()' escaneará toda la cadena que puede ser muy larga. Si la cadena tiene un montón de caracteres, los escaneará todos. Solo verifica el primer caracter para detectar una cadena vacía. – sharptooth

+0

esto funciona bien. Edité mi pregunta y ahora también necesito verificar si el archivo existe. ¿Podría verificar el archivo? ¡Muchas gracias! –

+0

La comprobación de la existencia de archivos es un problema diferente por completo. Es mejor hacer esa pregunta por separado, o mejor aún, buscar StackOverflow. Esa pregunta probablemente se haya preguntado antes. –

-1

si desea comprobar si la asignación de memoria no hacerlo de esta manera:

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

if (hwndTitleValue == NULL) return ALLOC_FAILED;

No veo el punto de trabajar con cadenas aquí.

Cuestiones relacionadas