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

本文通过一段C++代码示例,展示了直接修改字符串字面量所导致的问题,并提供了正确的做法。此外,还分享了一个关于数组作为函数参数时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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
















                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值