从错误中得知--关于字符串我以前没注意的东西
先来看一段代码,看你能发现其中的错误么:
#include<iostream>
using namespace std;
int main(void)
{
char* pstr=" I absolutely Love China ";//奥秘的关键语句之一
int beg=0,end=0,i=0;
while(pstr[i]==' ' || pstr[i]==13 || pstr[i]=='\t')
i++;
beg=i;
while(pstr[i]!='\0') i++;
while(pstr[i]==' ' && pstr[i]==13 && pstr[i]=='\t')
i--;
end=i;
cout<<beg<<endl<<end<<endl;
for(i=0;i<=end-1-beg;i++)
{
pstr[i]=pstr[i+beg];//奥妙在此处体现,运行到这时会出现这样的错误
//在此处设置调试断点的结果如下:
//
}
pstr[i]='\0';
cout<<pstr<<endl;
return 1;
}
运行结果:编译的时候不会有错误提示。
分析:
用语句char* pstr=" I absolutely Love China ";得到的pstr字符串指针指向的内存单元是不能写的,只能读,可以这样理解,
" I absolutely Love China "是常量。改为 char pstr[]=" I absolutely Love China ";在pstr[i]=pstr[i+beg];处就能正常运行了。
另有如下体会:
虽然以前知道数组名是常量,不能被第二次赋值,但是用的时候还是会不注意,我犯过一次这样的错误。
#include <iostream>
using namespace std;
int* pBubbleSort(int* a,int num)
{
int i=0,j=0;
for(;i<num-1;i++)
for(j=i+1;j<num;j++)
if(a[i]<a[j])
{
//不用临时变量交换两个数
a[i]=a[i]^a[j];
a[j]=a[j]^a[i];
a[i]=a[j]^a[i];
}
return a;
}
int main()
{
int a[10]={1,5,8,2,3,7,9,10,4,6},i=0;
int* p=NULL;
p=pBubbleSort(a,10);//注意不能用a=pBubbleSort(a,10);因为a是常量不能被第二次赋值。
for(;i<10;i++)
{
cout<<"p["<<i<<"]="<<a[i]<<" ";
}
cout<<endl;
return 1;
}