编写一个STL中的CString类
2010-01-23 20:32:29 来源:WEB开发网如果读取字符是'c'、'C'则长度加上2(考虑宽字符的情况);如果读取的是's'、'S'则要计算参数中给的字符串的宽度。
switch (*p)
{
case 'c':
case 'C':
nItemLen = 2;
va_arg(argList, char);
break;
case 's': // 字符串
case 'S':
nItemLen = strlen(va_arg(argList, const char*));
nItemLen = ((1) > (nItemLen)) ? (1) : (nItemLen);//如果是空串就使用1 即保存''
break;
}
如果读出的字符是'd'、'i'、'u'、'x'、'o','e'、'f'、'G'、'g'等,则长度加上对应的数值型的长度,当然最好使用sizeof计算,使得具有更好的移植能力。
case 'd':
case 'i':
case 'u':
case 'x':
case 'X':
case 'o':
va_arg(argList, int);
nItemLen = 32;
在for循环体的最后当然不要忘了把长度累计nMaxLen += nItemLen;当循环结束时,长度的计算也就完成了。
For循环结束时调用va_end(argList);
下面就可以开辟恰当的内存空间,来保存你的格式串。
char* ch = new char[nMaxLen+1];
有了空间再重新接收参数就可以了。
va_start(argList, pstrFormat);
vsprintf(ch, pstrFormat, argList);
va_end(argList);
最后不要忘了把空间加到std::string中,可以直接调用append函数:
this->append(ch);
然后释放你的内存空间
delete[] ch;
其他的函数可以用std::string中的相对应的功能包装即可,下面就再写一个MakeUpper函数,它也是CString中的。
void MakeUpper()
{
std::transform(this->begin (),
this->end (),this->begin (),
toupper);
}
是不是很容易呢,希望本文能起到抛砖引玉的作用,给你使用STL带来方便。
以上的程序编码在VC和g++中均可使用。本人曾用XString 类替代了一个用MFC编写的项目中的所有的CString类 ,使得它顺利的用G++编译通过。
本文配套源码
更多精彩
赞助商链接