题目的主要信息:
- 输入一个长度不大于30的字符串,再输入一个正整数m,将此字符串中从第m个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出
- 要求用指针处理字符串
具体做法:
题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个'\0'表示字符串的结束,如果长度小于数组长度,输入所有字符后加'\0',如果长度大于数组长度,截断输入的前面部分再在最后加'\0'。
我们准备一个新串来保存复制后的字符串,因为原串大小不会超过30,因此新串的大小也不会超过30.
题目要求使用指针,我们可以用两个指针,指针p一开始指向原串的第m个位置,指针q一开始指向新串的起始位置。然后利用指针p遍历原串,到末尾的'\0'结束,遍历过程中像指针q指向的地址复制指针p指向元素的值,然后指针同步后移。
#include <iostream>
using namespace std;
int main() {
char str[30] = { 0 };
cin.getline(str, sizeof(str));
int m;
cin >> m;
// write your code here......
char copystr[30] = { 0 };
char* p = str + m - 1; //指向字符数组第m个元素
char* q = copystr;
while(*p != '\0'){ //直到字符串结果
*q = *p; //复制
p++;; //两边指针都后移
q++;
}
cout << copystr << endl;
return 0;
}
复杂度分析:
- 时间复杂度:O(n),n为字符串的长度,最坏情况一次遍历
- 空间复杂度:O(1),无额外空间