Проверьте, пуста ли строка - PullRequest
6 голосов
/ 02 ноября 2010

У меня есть проект на C ++, который мне нужно отредактировать.Это объявление переменной:

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

Как проверить, пуста ли эта строка?

Я пытался просто с if(hwndTitleValue == ""), но он всегда возвращает false.Как проверить, пуста ли эта строка?

РЕДАКТИРОВАТЬ

Мне также нужно проверить, прикреплен ли файл.Вот код файла:

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

Как проверить, пусто ли hFile?

Ответы [ 7 ]

18 голосов
/ 02 ноября 2010

Самый простой способ проверить, является ли строка пустой, состоит в том, чтобы увидеть, является ли первый символ нулевым байтом:

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

Вы можете использовать strlen или strcmp, как в других ответах, ноэто сохраняет вызов функции.

11 голосов
/ 02 ноября 2010

Я считаю, что hwndTitleValue - это указатель, по крайней мере, в венгерской нотации.Ваш метод выделяет массив байтов (строка ANSI C), поэтому лучший способ сделать это будет

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

Однако вы можете взломать вышеуказанный метод и не использовать strcmp:

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

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

Следует отметить, что строка может быть не пустой, а заполненной пробелом.Этот метод скажет вам, что строка содержит данные (пробелы - это данные!).Если вам нужно учесть строки, заполненные пробелами, вам нужно сначала обрезать его.


EDIT : еще одна вещь, которую следует отметить, - что описанные выше методы не учитывают NULLуказатели правильно.Если указатель равен нулю, isEmpty вернет FALSE, что нежелательно.Мы можем удалить проверку NULL, и тогда она станет ответственностью вызывающей стороны, или мы можем определить, что isEmpty возвращает FALSE в строки 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, "");

}
3 голосов
/ 02 ноября 2010

Прежде всего, это не строка. Еще нет. Это просто указатель на кусок памяти, который для всех целей и целей содержит мусор, то есть некоторые случайные данные.

Строки в C являются указателями на символьные массивы с нулевым символом в конце. Таким образом, ваша пустая строка "" на самом деле является массивом из одного элемента со значением ноль. Но вы сравниваете между указателями , поэтому всегда происходит сбой.

2 голосов
/ 02 ноября 2010

Функция GlobalAlloc просто выделяет и возвращает блок памяти, а опция GPTR обнуляет байты выделенной памяти, поэтому вы можете просто использовать:

if (strlen(hwndTitleValve) == 0)

в предположении строки ANSI.Обратите внимание, что это будет лучше помечено как "C" и "Windows", а не C ++.

2 голосов
/ 02 ноября 2010

GlobalAlloc() вернет блок памяти, заполненный нулями (благодаря флагу GPTR), а не строку.Нет смысла проверять.Вам лучше проверить, что возвращаемый указатель не равен нулю.

Если этого вам недостаточно, просто проверьте

if (*hwndTitleValve == 0 ) {
}

Допустимая пустая строка будет хранить нулевой терминаторначало.

0 голосов
/ 02 ноября 2010

, если вы хотите проверить, не удалось ли выделить память, сделайте это так:

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

if (hwndTitleValue == NULL) return ALLOC_FAILED;

Не вижу смысла работать со строками здесь.

0 голосов
/ 02 ноября 2010

Мне кажется странным, что имя строки начинается с hwnd (это для дескрипторов окон), но в любом случае вы можете предположить, что LPSTR - это то же самое, что char *, и просто использовать что-то вроде strlen для проверки его длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...