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; }
欢迎拍砖。