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;
}
分享到:
相关推荐
idea原生代码片段管理插件Live Templates无法可视化管理,个人已习惯MyEclipse的Snippets插件,无耐idea无提供相关插件,开发人员在开发过程中大部分时间都是拷贝代码,如果能有相关插件来维护常用的代码片段,可以...
微信小程序sublime开发工具-自动补全代码片段微信小程序sublime开发工具-自动补全代码片段微信小程序sublime开发工具-自动补全代码片段微信小程序sublime开发工具-自动补全代码片段微信小程序sublime开发工具-自动...
verilog_snippets VS Code中将使用Verilog HDL的一些代码片段。 我按照自己喜欢的方式对其进行了编辑。 让我知道是否忘记添加内容。
50个jquery代码片段50个jquery代码片段
自1.3.0版本以后就没有自动补全功能了,也就是说1.2.4以前的版本是有自动补全功能的,下面是几种使用自动补全的方法。 1.使用旧版本 2.使用另一个插件 3.使用用户代码片段 此处为配置用户代码片段的文件!
android中一些常用的代码片段小结,界面全屏无标题等
PHP工具 PHP中经常使用的一些代码片段。 需要PHP 7.4 / 8.0及更高版本。 实用类班级名称功能说明 SM3加密工具 支持HMac的自定义算法 生成uuid字符串路径运算符 crc64算术工具 数组和地图数据工具 RSA crypt工具日期...
该扩展为.Rmd文档中的常见任务提供了一些代码片段和键绑定,例如,插入代码块并使用knitr::include_graphics()包括图像。 此外,它旨在为Bookdown和Blogdown提供一些帮助功能。 该项目处于发展的初期。 欢迎捐款...
8个js经典代码片段助你逃脱项目开发过程中遇到的一些坑,可快速激发你js思维,非常适合网站开发中的一些疑难杂症
去代码片段库golang的一些代码片段,轮子
vscode 使用C语言自定义代码片段
精选的 PHP 代码片段可以让您在30秒内快速学习和了解 PHP 编程。...这里是一些精选的 PHP 代码片段,可以帮助您快速学习和了解 PHP 编程。学习这些高级技巧,您还可以进一步提升 PHP 编程的能力和效率。
每位设计师都应该拥有的50个CSS代码片段 sublime text代码片段
CodeFragment this is some code fragment repository. 这是一个存放代码片段的仓库.
Code-fragment实践和学习中积累的一些代码片段
strokeit批量生成代码片段.lua,strokeit批量生成代码片段.lua,strokeit批量生成代码片段.lua
代码片段22
不知道你有没有这种烦恼,看到一段好的代码保存下来,过一段时间要么找不到要么很多地方都保存了各种各样的代码没法整理,这个软件就是解决你这个烦恼,可以很好的管理代码片段,支持分类功能,超级棒!
有了这么一个管理器,平时可以将自己辛苦写出来的代码片段或算法记录下来。实际上这只是个支持语法着色的简单代码编辑器,带了一点文件管理功能。 更新日志在http://blog.sina.com.cn/s/blog_6204ca300100lh20.html...
有时候,我们需要测试一些代码片段,而电脑中没有安装针对该语言的运行环境,没关系,你可以在线测试它们。 本文为你带来 8 款非常好用的代码片段在线工具,帮助你快速、方便地测试、编辑代码片段。 1. ideone ...