今天在写字符串旋转问题的代码时遇到了一个问题,纠结了很长时间,刚开始由于对C++语法的不熟悉,所以很长时间没有调试错误来,后来通过分析内存,才发现问题,刚开始的代码如下:
#include<iostream>
using namespace std;
void LeftShiftOne(char* ptr, int n){
char temp = ptr[0];
for(int i=1; i<n; i++){
ptr[i-1] = ptr[i];
}
ptr[n-1] = temp;
}
void RotateString(char *ptr, int n, int m){
while(m--){
LeftShiftOne(ptr, n);
}
}
int main(){
char* s = "abcdef";
cout << s << endl;
RotateString(s, 6, 2);
cout << s << endl;
return 0;
}
这个问题的出现最主要还是因为对C++中的存储区不太熟悉,C++中的存储区域分布如下所示
char *s = “abcdef”中”abcdef”是存储在文字常量去,该文字只可读,不可更改,所以每次在编译的时候不会报错,但是在运行的时候就会出错,比较好的解决方法为:
char s[7] = "abcdef";
其中s作为数组名,其本质意义跟指针是类似的。这里定义一个数组过后,那么”abcdef”值就是存储在栈区,其值就可以被修改。
假若要使用引用来解决该问题,该如何去解决呢?
void LeftShiftOne(char (&ptr)[7], int n){
char temp = ptr[0];
for(int i=1; i<n; i++){
ptr[i-1] = ptr[i];
}
ptr[n-1] = temp;
}
void RotateString(char (&ptr)[7], int n, int m){
while(m--){
LeftShiftOne(ptr, n);
}
}
使用引用来解决问题就有一个不方便的地方,那就是在函数参数中我们必须要确定引用数组的大小,这样当我们定义的数组长度发生变化时,就需要修改很多地方,那么有什么解决办法吗?
一种比较好的解决办法就是使用模板
template <int N>
定义模板过后就在函数中将数组的大小替换成模板定义中的N即可,这个深层次的原理还没有弄懂,它应该是涉及到模板的一些机制,当前模板还不是很熟。