1.
对于sizeof计算数组长度:
1)栈内数组,如char buf[20],那么sizeof(buf)=20
2)堆内数组,栈内指针,如char *buf=new char[20],那么sizeof(buf)=4,实际上是buf指针的长度,而非数组的长度,这需要注意
2.
使用strcat时需要注意,新加的字符串是接到原字符串的末尾,即‘\0’后面,有时在
堆上开辟一段空间(new 出来的),没有将此空间清0,而直接使用strcat,结果是字符串放不进去,因为空间内可能就没有‘\0’,除非此空间首元素就是‘\0’,否则都会导致意外的结果(在栈内申请的空间似乎可以不考虑此问题,默认内容都是0)。
3.
fgetwc()似乎并没有让指针移动2个字节,仍然只移动一个字节,只不过将返回值转成为wchar
4.
windows 下进行字符集编码转换可使用
WideCharToMultiByte和MultiByteToWideChar,需要包含头文件<windows.h>
linux下没有<windows.h>,无法使用这两个函数,但有两个简洁的替代函数:
wcstombs()和mbstowcs(),
唯一需要注意的是如果字符串为中文,则必须在程序中先调用setlocale()来定义当前的
locale语言
(此函数需要包含头文件<locale.h>),如setlocale (LC_ALL, "chs");(设置中文),但我用cygwine的G++时,
设置"chs",调试发现转换并不成功(wcstombs返回值始终为-1),无意间将“chs”变为“”,
屏幕才正常显示中文(说明转换成功了),原因仍未知。
举个例子:
int nConv=wcstombs(str, (const wchar_t*)raw, len);
string *s=new string(str,nConv);
其中str和raw都是char数组,长度都是len,也最好设置它俩长度相等,因为转换后的多字节字符串可能和原宽字符的字符串长度差不多(对于中文就是这样,对于英文可能只有原来的一半长度了,要是中英混合,长度就不定了)。
5.
对于内存溢出的检测,VC++ 里面比较简单,使用
Visual Leak Detector就可以,简单易用,只需添加一个头文件<vld.h>,或许还需要将一些dll搬到程序目录下,然后就是把include和lib路径添加到编译器的搜寻路径中,然后就没了,运行完程序它就可以报告有多少内存没回收了。