每日一背
C的字符串很特殊
//返回字符
char test2()
{
return 'p';
}
//返回整数
int test2()
{
return 90;
}
其实字符串本就是很特殊的存在。字符型、整数算一类,但是字符串型区别前两个类。整数、字符都返回的是一个值,所以可以直接在主函数里面cout不会报错,也可以赋值给其他。但是字符串就不一样了。以下就错了,字符串返回的是地址,整型返回的是值。
char test2()
{
return "hello";
}
局部变量离开函数就会被销毁,但值还是可以继续赋值,而地址就已经被彻底销毁了,无法返回,打印的化也是乱码。以下代码没有错,但是返回值没有意义了,因为变量赋值前已经被销毁了。所有cout打印是乱码。
char* test2()
{
char str[10] = "hello";
return str;
}
如何返回字符串?
解决办法有4种。
1-new块内存
//在函数内部new一块内存给数组
char* test2()
{
char* str = new char[20] {"helloworld"};
return str;
}
//main部分,在主函数里面定义指针指向这块地址,最后一定要销毁这块地址
int main()
{
char* str = test2();
cout << str;
delete[] str;
}
这个时候的str就是未初始化的内存。
2.添加static
在函数里面定义static变量后,这个值就一直存在了,不会被销毁。相当于在函数里面创建了一个。和程序同生命的变量,不过只能在函数里面使用
char* test2()
{
static char str[] = "helloworld";
return str;
}
3.搞全局变量
无法返回的根本原因就是局部变量地址被销毁了,全局变量在函数里面运行完后不会吧销毁。至少要在参数列表里面使用形参指针。
//定义全局变量
char str[] = { "you are my sun"};
//定义形参指针
char* test2(char* str)
{
return str;
}
//主函数
cout << test2(str);直接打印
4.单独为字符串开个变量string
以上3个都是字符串借用字符的数据类型办事,数组就是借用字符数据类型都很麻烦,不如自己搞个数据类型。C++专属。不需要数组。这回string ,char ,int倒是一样的了
string test2()
{
string str= "hello";
return str;
}
cout << test2();
转义字符
它在ASCII中的值为0(数值0,非字符‘0’)
对于 ASCII 编码,0~31(十进制)范围内的字符为控制字符,它们都是看不见的,即不能在显示器上显示,甚至无法从键盘输入;部分控制字符在编辑语言中还被定义为特殊用途。因此只能用转义字符的形式来表示它们。不过,直接使用 ASCII 码记忆不方便,也不容易理解,所以针对常用的控制字符,各类编程语言对转义字符又定义了简写方式。
要使用转义字符的,就只有ASCII的前0-31号
要么输入7然后转换成ASCII码,要么用转义字符。
解引用判断
*str == '\0'
*str == 0
和
*str == ‘0’
*str == 48
以上两种是一个概念,对指针解引用是当前字符,等式右边可以有两种形式,一是字符,二是字符对应的ASCII码
字符串打印
char str1[]={"hello"}
cout<<str1——打印全部
cout<<*str1—— 打印第一个字符,因为str1默认第一个字符地址,解引用
cout<<str1[2]——打印下标为2的对应字符
cout<<* & str1[2]——打印下标为2的对应字符,不过这有点吃多了。