`
larrytang
  • 浏览: 19626 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

一些代码片段

    博客分类:
  • VC++
阅读更多
1.不要用return语句返回指向“栈内存”指针。
char* getmem(int num)
{
    char *p = (char*)malloc(sizeof(char)*num);
    return p;
}

int main(int argc, char* argv[])
{
    char *str = NULL;
    str = getmem(12);
    strcpy(str, "Hello fuck!");
    cout<<str<<endl;
    free(str);
    return 0;
}

这种方式是可以的,因为返回的不是“栈内存”指针。所谓的“栈内存”指针是指固定大小的数组、
变量等。

2.一个不错的字符串 hash 函数
unsigned long hash(const char *name,size_t len)
{
    unsigned long h=(unsigned long)len;
    size_t step = (len>>5)+1;
    for (size_t i=len; i>=step; i-=step)
        h = h ^ ((h<<5)+(h>>2)+(unsigned long)name[i-1]);
    return h;
}

一个方便的 hash 函数应该散列的比较开,计算速度跟字符串长度关系不大,又不能只计算字符
串的开头或末尾。这里的算法是从Lua 中看来的。

3.UTF8 到 UTF16 的转换(单个字符)
int UTF8toUTF16(int c)
{
    signed char *t=(signed char*)&c;
    int ret=*t &(0x0f | (~(*t>>1) &0x1f) | ~(*t>>7));
    int i;
    assert ((*t & 0xc0) != 0x80);
    for (i=1;i<3;i++) {
        if ((t[i] & 0xc0)!=0x80) {
            break;
        }
        ret=ret<<6 | (t[i] & 0x3f);
    }
    return ret;
}

这只是一个字符的转换,如果转换字符串,可以再做一点优化。

4.宽字符和窄字符转换的问题
BOOL UnicodeToAnsi(LPWSTR pszwUniString, LPSTR pszAnsiBuff, DWORD dwAnsiBuffSize)
{
    int iRet = 0;
    iRet = WideCharToMultiByte(CP_ACP, 0, pszwUniString, -1, pszAnsiBuff,
    dwAnsiBuffSize, NULL, NULL);
    return (0 != iRet);
}

BOOL AnsiToUnicode(LPSTR pszAnsiString, LPWSTR pszwUniBuff, DWORD dwUniBuffSize)
{
    int iRet = 0;
    iRet = MultiByteToWideChar(CP_ACP, 0, pszAnsiString, -1, pszwUniBuff,
    dwUniBuffSize);
    return (0 != iRet);
}


// 应用示例
LPSTR lpCmdLine;
LPWSTR lpwCmdLine;
AnsiToUnicode(lpCmdLine, lpwCmdLine, sizeof(lpwCmdLine));
lpCmdLine = NULL;
UnicodeToAnsi(lpwCmdLine, lpCmdLine, sizeof(lpwCmdLine));
static_cast<char*>(lpCmdLine);
// Function that safely converts a 'WCHAR' String to 'LPSTR':
char* ConvertLPWSTRToLPSTR (LPWSTR lpwszStrIn)
{
    LPSTR pszOut = NULL;
    if (lpwszStrIn != NULL)
    {
        int nInputStrLen = wcslen (lpwszStrIn);
        // Double NULL Termination
        int nOutputStrLen = WideCharToMultiByte (CP_ACP, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
        pszOut = new char [nOutputStrLen];
        if (pszOut)
        {
            memset (pszOut, 0x00, nOutputStrLen);
            WideCharToMultiByte(CP_ACP, 0, lpwszStrIn, nInputStrLen, pszOut,
            nOutputStrLen, 0, 0);
        }
    }
    return pszOut;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics