WEB开发网      婵犻潧鍊婚弲顐︽偟椤栨稓闄勯柦妯侯槸閻庤霉濠婂骸浜剧紒杈ㄥ笚閹峰懘鎮╅崹顐ゆ殸婵炴垶鎸撮崑鎾趁归悩鐑橆棄闁搞劌瀛╃粋宥夘敃閿濆柊锕傛煙鐎涙ê鐏f繝濠冨灴閹啴宕熼鍡╀紘婵炲濮惧Λ鍕叏閳哄懎绀夋繛鎴濈-楠炪垽鎮归崶褍妲婚柛銊ュ缁傚秹鏁撻敓锟� ---闂佹寧娲╅幏锟�
开发学院软件开发VC 编写一个STL中的CString类 阅读

编写一个STL中的CString类

 2010-01-23 20:32:29 来源:WEB开发网 闂侀潧妫撮幏锟�闂佸憡鍨电换鎰版儍椤掑倵鍋撳☉娆嶄沪缂傚稄鎷�婵犫拃鍛粶闁靛洤娲ㄩ埀顒佺⊕閵囩偟绱為敓锟�闂侀潧妫撮幏锟�  闂佺ǹ绻楀▍鏇㈠极閻愭娑樷枎閹邦剛娉氶梺鍛婎殔濞层劌鈻撻幋婵愬殫妞ゆ梻鍘х憴锟�
核心提示:如果读取字符是'c'、'C'则长度加上2(考虑宽字符的情况);如果读取的是's'、'S'则要计算参数中给的字符串的宽度,switch (*p){case 'c':case 'C':nItemLen = 2;va_arg(ar

如果读取字符是'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++编译通过。

本文配套源码

上一页  1 2 3 

Tags:编写 一个 STL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接