在某例题中,遇到拼接字符串的操作,苦于对基础知识的不了解,所以出了一些个问题:
指针的使用比较模糊
传值问题的认识比较模糊
一、比较容易想到的办法:
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。