2012-01-06 2 views
0

Я был разработчиком C#.Как написать код C, который похож на String.isNullOrEmpty в C#

Но теперь мне нужно написать код C.

Раньше я использовал String.IsNullOrEmpty() для предотвращения ошибок и назначения новой строки.

Надеюсь написать код C, чтобы действовать как String.IsNullOrEmpty. и назначьте новую строку

поэтому я написал несколько примеров кода.

static char *pCtvUrl; 

void set_app_url(const char* appUrl){ 
    if(!appUrl || !*appUrl) 
     return; 
    pCtvUrl = malloc(sizeof(appUrl)); 
    strcpy(pCtvUrl,appUrl); 
} 

Я хочу проверить, правильно это или нет.

Если вы знаете лучший способ решить, пожалуйста, дайте мне совет.

благодаря

ответ

2

Ваш чек на NULL или пустая строка правильно

Изменение:

pCtvUrl = malloc(sizeof(appUrl)); /* This would allocate sizeof(char*) only. */ 

к:

pCtvUrl = malloc(sizeof(char) * (strlen(appUrl) + 1)); /* '+1' is for null terminator.*/ 

Вы также должны free() память pCtvUrl перед тем переназначение его:

static char *pCtvUrl = 0; 

До pCtvUrl = malloc(...); позвонить по телефону free(pCtvUrl);.

Вместо того, чтобы использовать глобальную переменную рассмотреть вопрос об изменении set_app_url() вернуть копию строки:

char* set_app_url(const char* appUrl) 
{ 
    char* retVal = 0; 

    if (appUrl && *appUrl) 
    { 
     retVal = malloc(strlen(appUrl) + 1); 
     strcpy(retVal,appUrl); 
    } 

    return retVal; 
} 

Вызывающий будет нести ответственность за освобождение возвращаемой строки.

+0

спасибо, как насчет 'malloc ((sizeof (char) +1) * strlen (appUrl))' вместо 'malloc (strlen (appUrl) + 1)' ?? –

+0

@sunglin sizeof (char) = 1 so '(1 + 1) * X! = 1 * X + 1' для' X> 1' – RedX

+0

@sunglim, 'malloc (sizeof (char) * (strlen (appUrl) + 1)); '. – hmjd

1

Проверка appUrl ли NULL или «пустой» правильно.

Однако вызов функции set_app_url более одного раза приведет к утечке памяти. Вы не освобождаете предыдущие pCtvUrl.

Кроме того, у вас может быть недостаточное буферизация. Вам нужно malloc strlen(appUrl) + 1. Во всяком случае, я предлагаю вместо этого использовать strdup.

+0

спасибо за ответ и предложение –

+0

sizeof (appUrl) + 1 все еще неверно. см. ответ @hmjd. – ColWhi

+0

'sizeof (appUrl)' возвращает размер указателя, ** не ** длина строки –

Смежные вопросы