C++初学者---字符串右移

学C++有段时间了,写点东西记录一下。

前段时间去面了一个嵌入式(VC)的职位。笔试中有一道题是这样的:循环右移一个字符串,比如原来是“abcde”,要求移动2位,结果是“cdeab”。函数原型为:void RightMove(char *pChar, int steps),给出实现代码。我的思路是这样的,首先要考虑pChar是否为NULL以及steps否合法(小于0或者大于字符串长度本身)。于是在pChar为空或者steps < 0时直接返回,另外如果steps > strlen(pChar)时修改steps值为其与字符串长并的模(即在调用者的角度看效果是正常的);其次,右移的实质是把要移动的前steps位字符追加到最末尾,于是想可以构建两个字符串,pfront存储steps位后面的字符、pback存储前steps位字符。然后通过把pfront复制到pChar再把pback追加到pChar,最后释放内存。Code中for循环那段开始在想有没有STL中有现成函数可以直接调用,但没想出来。在MSDN也没找到相关。望有心人告知。最终写下了如下Code:

void RightMove(char *pChar, int steps)
{
    if (NULL == pChar || steps < 0)
    {
        return;
    }

    if (steps > strlen(pChar))
    {
        steps %= strlen(pChar);
    }

    char *pfront = new char[strlen(pChar) - steps + 1];
    char *pback = new char[steps + 1];

    for (int i = 0; i < strlen(pChar) - steps; i++)
    {
        pfront[i] = pChar[i + steps];
    }

    pfront[strlen(pChar) - steps] = '\0';

    strncpy(pback, pChar, steps);
    pback[steps] = '\0';
    memset(pChar, 0, strlen(pChar));

    strcpy(pChar, pfront);
    strcat(pChar, pback);

    delete []pfront;
    pfront = NULL;
    delete []pback;
    pback = NULL;
}

如下验证OK:

int main(int argc, char **argv)
{
    char test[] = "abcde";
    cout << test << endl;

    RightMove(test, 99);
    //RightMove(test, 3);
    //RightMove(test, 5);
    //RightMove(test, 0);
    //RightMove(test, -1);

    cout << test << endl;

    return 0;
}

欢迎拍砖。

posted @ 2013-01-17 11:34  小楼一夜听风雨  阅读(2051)  评论(0编辑  收藏  举报