对字符、字符串的研究

每日一背

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码,要么用转义字符。

'\7'等价于(char)7

解引用判断

*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的对应字符,不过这有点吃多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值