如何在C#中编写类似于String.isNullOrEmpty的C代码

时间:2012-01-06 10:12:22

标签: c# c

我一直是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 个答案:

答案 0 :(得分: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;
}

调用者负责释放返回的字符串。

答案 1 :(得分:1)

检查appUrlNULL还是“空”是否正确。

但是,多次调用set_app_url函数会导致内存泄漏。您之前没有释放pCtvUrl

另外,你可能有buffor underrun。你需要malloc strlen(appUrl) + 1。无论如何,我建议strdup在这里使用,而不是。