C++ 学习日常填坑---字符串拼接问题

在某例题中,遇到拼接字符串的操作,苦于对基础知识的不了解,所以出了一些个问题:


指针的使用比较模糊

传值问题的认识比较模糊


一、比较容易想到的办法:

void test1() {
	char a[20] = "hello";
	char b[20] = " world";
	cout<<"add--->"<<add(a,b)<<endl;
}
char* add(char *x,char *y) {
	cout << "x:" << x << endl;
	cout << "y:" << y << endl;

	cout << "x-->size"<<sizeof(x) << endl;
	cout << "y-->size" << sizeof(y) << endl;
	
	strcat(x,y);
	return x;
}

这是比较好想的

1.在调用函数前,使用char字符数组

2.在add函数中传入两个数组的地址

3.通过strcat方法,其需要两个参数--1.char *和const  char*

4.通过char *返回数组的地址

        ******在这里有个疑惑

            数组通过向下函数参数传值的时候时可以打印全部的。

        数组通过返回值返回回去之后是不能打印全部的,只能打印首地址。


5.结束。


二、出现了问题的方法。

例题中是让以以下形式计算:

add("abc","def");

而我上面的实现是--先搞到数组,然后传递的是数组地址,这样有些违背做法。

所以按题目要求去实现:

void test3() {
	//char *p;
	string p = add("abc", "def");
	cout << "结果为:" << p << endl;;
}
string add(char *a, char *b) {
	char tmp[100] = { 0 };

	cout << "a" << a << endl;
	cout << "b" << b << endl;
	strcat(tmp, a);
	strcat(tmp, b);

	cout << "tmp" << tmp << endl;
	string flag(&tmp[0],&tmp[strlen(tmp)]);
	cout << "s+++>" << flag << endl;
	//char* b=(char*)a.c_str(); 
	/*char *x = (char *)flag.c_str();
	cout << "xxxx___>" << x << endl;
	return x;*/
	return flag;
}

这是实现完成的代码,比较容易理解,注意几点:

1.使用string输出的时候,完全可以用cout输出,需要在头部:

#include<string>

注意!是string!不是string.h!

这样就可以在cout中输出string了。

2.字符数组———》string

string flag(&tmp[0],&tmp[strlen(tmp)]);

格式是:string flag(数组第一个值的地址 , 数组最后一个值的地址);


三、遇到的问题:

不得不说,编程语言的学习就是填坑的过程,由于自己不细心而导致的坑,现在不得不填上。

在这里了解了const的用法

const定义的是一个静态、不可更改的变量。


在二中的程序中,在strcat函数中,每次运行总是程序崩掉,百思不得其解。

索性查看了strcat的源码,发现其有一句

    	while (*strSrc!='\0') {
		/**strDest = *strSrc;

		*strDest++;
		*strSrc++;*/
		cout << "*strSrc--->" << *strSrc << endl;
		*strSrc++;
	}

就是目前指针所指的字符串中‘某个字符’不能被再次赋值!

其原因是:

我传进去的两个参数都是原先定义好的,这样:

add("abc", "def");

这样子在“双引号”中被括起来的量称作“常量字符串”,其解释如下:

<高质量C C++编程指南>这本书上说: 

指针p 指向常量字符串(位于常量存储区),常量字符串的内容是不可以被修改的,

企图修改常量字符串的内容而导致运行错误。

所以这个问题出现的原因是char*p=”abcdefghi”,赋值的是字符串常量,

存储在常量存储区,而常量存储区的内容是无法修改的。


所以,传入的参数不符合规范。

因此不能使用单纯的strcat("常量","常量"),而应该加上一个辅助数组,这样可以比较轻易的完成常量字符串的拼接。

其拼接过程如下:

void pinjie() {
	char *x = "abc";
	char *y = "def";
	char tmp[20] = "";
	strcpy(tmp,x);
	strcat(tmp,y);
	cout << "拼接成功!---》" <<tmp<< endl;
	//string all = *x + *y;
}

这指示简单的拼接,无法返回比较有用的值,所以不建议使用。

推荐使用第二种,返回string的,这样可以对返回的值进行操作。

ok。








猜你喜欢

转载自blog.csdn.net/qq_35343446/article/details/79547497