第一眼看到这题,脑海中想到strcpy.
于是第一次实践如下:
#include
using namespace std;
enum ResultState
{
FAIL = -1,
SUCC
};
int halfInverse(char* pSrc)
{
if (NULL == pSrc)
{
return FAIL;
}
int iLength = strlen(pSrc);
char* pTep = new char[iLength + 1]();
pTep[iLength] = '\0';
strncpy(pTep, pSrc + iLength/2, iLength/2);
strncpy(pTep + iLength/2, pSrc, iLength/2);
strcpy(pSrc, pTep);
return SUCC;
}
void myPrint(char* pSrc)
{
if (NULL == pSrc)
{
return;
}
int iLen = strlen(pSrc);
for (int i=0; i
上述代码可以在VS2010 编译并运行通过。
仔细想想,在函数halfInverse里面申请了一段内存,这段内存可以不像原来的一样大,只要一半就可以了。
于是又有了第二次实践:
#include
using namespace std;
enum ResultState
{
FAIL = -1,
SUCC
};
int halfInverse(char* pSrc)
{
if (NULL == pSrc)
{
return FAIL;
}
int iLength = strlen(pSrc)/2;
char* pTep = new char[iLength + 1]();
pTep[iLength] = '\0';
strncpy(pTep, pSrc, iLength);
memcpy(pSrc, pSrc+iLength, iLength);
strncpy(pSrc+iLength, pTep, iLength);
return SUCC;
}
void myPrint(char* pSrc)
{
if (NULL == pSrc)
{
return;
}
int iLen = strlen(pSrc);
for (int i=0; i
照样可以实现相应的功能,新申请的内存少了一半。但是里面有了strncpy memcpy这样的耗费时间的函数,第二在想想是否可以不要借助这个新申请的内存。 看看前半部分和后半部分的字符相隔一定距离,a 和 d 相隔3个字符, b 和 e 相隔3个字符, c和f 相隔 3 个字符,都是字符串长度的一半。
然后又有了第三次实践:
#include
using namespace std;
enum ResultState
{
FAIL = -1,
SUCC
};
int halfInverse(char* pSrc)
{
if (NULL == pSrc)
{
return FAIL;
}
int iLen = strlen(pSrc)/2;
char cTmp = '\0';
for (int i=0; i
这样一来就不用额外申请空间了。
一个小程序整整反映了自己的思考过程,也反映了自己的思考缺陷,需要慢慢改进啊。