您的位置:首页 > 编程语言 > C语言/C++

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

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

指针的使用比较模糊
传值问题的认识比较模糊

一、比较容易想到的办法: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.字符数组———》stringstring 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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐