C++字符串小问题,请大家帮个忙,很简单
C++程序设计,关于字符串的strcat(char[],constchar[])函数,云:“请思考,为什么不把第一个字符数组声明为const?”问:“什么叫做const数...
C++程序设计,关于字符串的strcat(char[],const char[])函数,云:“请思考,为什么不把第一个字符数组声明为const?”
问:“什么叫做const数组?”
顺便提供点线索。
我刚刚做的
char strcat(char a[],char b[])
{
char c[30];
static int i;int k;
for(i=0;c[i]!='\0';i++) c[i]=a[i]; for(i+=1,k=0;c[i]!='\0';i++) c[i]=b[k];
return c[30];}
就是不知道该怎么传递n,就是char[30]中的30,怎么从实参那里传过来,前提不改变形参个数。
我的a[],b[]两个char 都是非const,都可以使用啊?还有,怎么定义const char数组,有什么意义?跟const常变量一样吗?问题有点多,谢谢了。 展开
问:“什么叫做const数组?”
顺便提供点线索。
我刚刚做的
char strcat(char a[],char b[])
{
char c[30];
static int i;int k;
for(i=0;c[i]!='\0';i++) c[i]=a[i]; for(i+=1,k=0;c[i]!='\0';i++) c[i]=b[k];
return c[30];}
就是不知道该怎么传递n,就是char[30]中的30,怎么从实参那里传过来,前提不改变形参个数。
我的a[],b[]两个char 都是非const,都可以使用啊?还有,怎么定义const char数组,有什么意义?跟const常变量一样吗?问题有点多,谢谢了。 展开
5个回答
展开全部
这个是要把数组传递给子函数操作,实际上只能传递的是该数组的指针,也就是子函数的数组指针指向的内容和主函数的是同一个,在子函数里修改其内容就是更改主函数里数组的内容。
把形参设置成const,子函数就无权中修改其内容,保护了数据的安全性。
所以在写传给子函数指针型数据时,如果不想(或不能)改变指针所指的数据,将指针的类型声明为const,即常量,这时可以防止在子函数里无意的改变其内容。但是对于简单的数据传递,由于是把数据复制到参数,子函数和主函数的数据完全不想干,就不用声明该数据是const型的。
如果第一的参数也是const的,这个函数就不能对第一个参数进行操作,从而无法实现函宏冲绝数的功能,即连接字符操作。
char * strcat(char *a,const char *b)
{
int i,k;
for(i=0;a[i]!='\0';i++);
for(k=0;b[k]!='\0';i++,k++) a[i]=b[k];
a[i]='\0';
return a;
}//a的长度必须大于字符串a和b的实际长度和,不然会越界。越界后也不会抱错,只是执行会得到奇怪的结果。。。。
//这个函数因该这么实现。a的长度不用传递;
void main()
{
char a[30]="abc",b[]="efg";
strcat(a,b);
printf("%s\n",a);
}
结果输出 abcefg
你那函数返回的只能是个char类型的数据,你返回了个char[30],这是不能实现的判正,c[30]只在子函数里存在,i不用再加1了,第一个for循环后,i已经是字符尾部了。蔽姿
把形参设置成const,子函数就无权中修改其内容,保护了数据的安全性。
所以在写传给子函数指针型数据时,如果不想(或不能)改变指针所指的数据,将指针的类型声明为const,即常量,这时可以防止在子函数里无意的改变其内容。但是对于简单的数据传递,由于是把数据复制到参数,子函数和主函数的数据完全不想干,就不用声明该数据是const型的。
如果第一的参数也是const的,这个函数就不能对第一个参数进行操作,从而无法实现函宏冲绝数的功能,即连接字符操作。
char * strcat(char *a,const char *b)
{
int i,k;
for(i=0;a[i]!='\0';i++);
for(k=0;b[k]!='\0';i++,k++) a[i]=b[k];
a[i]='\0';
return a;
}//a的长度必须大于字符串a和b的实际长度和,不然会越界。越界后也不会抱错,只是执行会得到奇怪的结果。。。。
//这个函数因该这么实现。a的长度不用传递;
void main()
{
char a[30]="abc",b[]="efg";
strcat(a,b);
printf("%s\n",a);
}
结果输出 abcefg
你那函数返回的只能是个char类型的数据,你返回了个char[30],这是不能实现的判正,c[30]只在子函数里存在,i不用再加1了,第一个for循环后,i已经是字符尾部了。蔽姿
展开全部
strcat 是把参数2的内容(字符串),添加到参数1。
const 对应的实参 可以是 常量字符串蚂做山,例如:"abc123".
而第一个参数用于 从尾部开始胡拆添加字符串,所以必须是变量,不能是 常量字符串。
char s1[80]="XYZ";
strcat(s1,"abc123"); // s1 内容变 "闷中XYZabc123"
const 对应的实参 可以是 常量字符串蚂做山,例如:"abc123".
而第一个参数用于 从尾部开始胡拆添加字符串,所以必须是变量,不能是 常量字符串。
char s1[80]="XYZ";
strcat(s1,"abc123"); // s1 内容变 "闷中XYZabc123"
追问
为什么 第一个参数用于从尾部开始添加字符串就必须是变量,不能是常量字符串?
追答
常量字符串 是常量,常量是不可变化的量,存放空间大小也不可变化。
例如,一只杯子放满了水,你没办法再往里添进水。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、这个问题首先要讲const char[],其实是const(char []),为了方便理解,将数组变为指针const(char*),再加个变量,型皮方便解说const(char*p)。这里的p是一个指针,同时,这个指针指向的空间是const类型(也就是说,这个指针指向的空间不枯掘能被改变)。
2、然后再讲extern char *strcat(char *dest,char *src);函数,这个函数目的是在dest指向的空间内追加字符串src指向的内容,其中字符串均以'\0'结尾,并且该函数不对字符串是否有足够大的空间进行检测操作。所卜败差以这个函数参数不用数组。
char* strcat ( char * dest, const char * src )
{
char * cp = dest;
while( *cp !=’\0’)
cp++;
while( (*cp++ = *src++)!=’\0’ ) ;
return dest ;
}
2、然后再讲extern char *strcat(char *dest,char *src);函数,这个函数目的是在dest指向的空间内追加字符串src指向的内容,其中字符串均以'\0'结尾,并且该函数不对字符串是否有足够大的空间进行检测操作。所卜败差以这个函数参数不用数组。
char* strcat ( char * dest, const char * src )
{
char * cp = dest;
while( *cp !=’\0’)
cp++;
while( (*cp++ = *src++)!=’\0’ ) ;
return dest ;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
strcat函虚烂数的行亏作用是把第二个参数的字符串加到第一个参数后边连接起来,那么说明第一个字差带漏符数组是可以变化的,故不能为const
----------------
const数组就是不能改变的数组。。。
----------------
const数组就是不能改变的数组。。。
更多追问追答
追问
为什么允许第一个可以变化?
追答
strcat函数的作用是把第二个参数的字符串加到第一个参数后边连接起来,那么说明第一个字符数组是可以变化的
例如:
char a[10] = {"abc"};
char b[4] = {"123"};
strcat(a,b);
=> a变成了"abc123",那么第一个参数必须可变。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的函数是在白消耗CPU时间和内存,没有任何作用。
实现的不是strcat的原意。
strcat是把唯腊第二个参数所指字符串连到第一个末。
第一个要写,所以char*,第二个只读,所以const char*
数组传参退化成指针,这个没有办法。
如果想传入指梁滑大小,就得另加参数。
就是按传统的0定末尾来确定字符串尾,也无法确定原数组的大小。
所以实际上strcat有很大的安全隐患,实际C编程都是用strncat
另外,传string&,const string&,这样的渣派话是内部带大小的
实现的不是strcat的原意。
strcat是把唯腊第二个参数所指字符串连到第一个末。
第一个要写,所以char*,第二个只读,所以const char*
数组传参退化成指针,这个没有办法。
如果想传入指梁滑大小,就得另加参数。
就是按传统的0定末尾来确定字符串尾,也无法确定原数组的大小。
所以实际上strcat有很大的安全隐患,实际C编程都是用strncat
另外,传string&,const string&,这样的渣派话是内部带大小的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询