从错误中得知--关于字符串我以前没注意的东西

来源:互联网 发布:ccs软件功能 编辑:程序博客网 时间:2024/05/21 09:54

先来看一段代码,看你能发现其中的错误么:

#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;}


	
				
		
原创粉丝点击