C++ 学习日常填坑---字符串拼接问题
2018-03-13 22:22
225 查看
在某例题中,遇到拼接字符串的操作,苦于对基础知识的不了解,所以出了一些个问题:
指针的使用比较模糊
传值问题的认识比较模糊
一、比较容易想到的办法:void test1() {
char a[20] = "hello";
char b[20] = " world";
cout<<"add--->"<<add(a,b)<<endl;
}
这是比较好想的
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;;
}
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。
指针的使用比较模糊
传值问题的认识比较模糊
一、比较容易想到的办法: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。
相关文章推荐
- C++学习笔记(字符串string、vector_deque、queue,multiset、map、multimap、容器拷贝问题)
- C++学习之字符串的输入问题
- C++ const char* 常量字符串拼接问题
- C/C++学习笔记32:字符串操作与字符子串问题
- C++学习笔记(字符串string、vector_deque、queue,multiset、map、multimap、容器拷贝问题)(复制粘贴,方便后面翻阅)
- C/C++日常学习总结(第六篇)多基派生引起的虚函数访问二义性问题&重载,覆盖,隐藏的区别
- JavaScript基础教程之学习过程中遇到的问题:字符串拼接
- JavaScript基础教程之学习过程中遇到的问题:字符串拼接
- C++中 替换string类型字符串中汉字的问题
- C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)(转帖)
- C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)
- 《Windows Via C/C++》边学习,边翻译(四)操作字符和字符串-3
- C/C++学习笔记:指针与字符串
- c++学习笔记2——指向字符串的指针数组?
- 《Windows Via C/C++》边学习,边翻译(七)操作字符和字符串-6
- c++中 关于字符串的一些需要注意的问题
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(3) 最大子序列和问题
- 《Windows Via C/C++》边学习,边翻译(二)操作字符和字符串-1
- JAVA与C++::关于JNI中文字符串操作问题总结
- 《Windows Via C/C++》边学习,边翻译(六)操作字符和字符串-5