前言
做了个笔试题,最后一题卡在char相关转换的问题上,笔者直接心态崩了,这里对于C还是不熟悉,所以特地写下这个博客,希望好好掌握char类型。
引用看学习视频中老师的一句话:一个普通程序员在企业中 90%的精力,都花在了字符串的处理上。
从上面这句话,我们足以能看出字符串的重要性,这也决定了字符串在各大面试和笔试中,都极易考到。
目录
1.char类型
依据C++ primer plus中文第六版定义:char字符类型是专为存储字符而设计的。(比如字母和数字)
对于char类型构造我们可以早已了解如下定义:
int main()
{
char p = 'A';
char q = 'B';
char m[] = {'A','B'};
return 0;
}
一个字符的表示方式,或者一个字符数组的表示方式。但是这么简单,面试笔试不可能会问这种。而且对于C语言也不可能没有其他的简单表示方式。
所以这里我们就需要学习字符串。
2.字符串类型
字符串存储在只读数据段。
字符串和字符的差别:
1.我们可以直接看出来,那就是字符是单引号'A',而字符串是双引号“Apple”;
2.字符串的结尾是以 '\0' 结束,这是系统对双引号的字符串自动加的。而字符或字符数组则没有。
测试:
int main()
{
char m[] = {'A'};
cout<<sizeof(m)<<endl; //输出为1
cout<<sizeof('A')<<endl;//输出为1
cout<<sizeof("A")<<endl;//输出为2
return 0;
}
3.如何处理字符串常量
我们不能直接使用字符串,这也不方便,所以我们需要一个字符指针来指向字符串,即char*;
(这里的程序中,我直接cout这个指针,C++直接自动输出m指向的字符串,这算是cout对于字符串的特殊对待,我们如果想打印地址,可以使用强转)
int main()
{
char * m = "chen";
cout<<m<<endl; //输出chen
cout<<(void*)m<<endl;//输出地址
return 0;
}
再看一个例子:
int main()
{
char * m = "chen";
m[0] = 'd';
return 0;
}
这个例子,本人的编译运行的时候直接崩溃,这是因为由于字符串存储在只读数据段,所以不可以修改。对于这个我们可以看下面这个例子
int main()
{
char * m = "chen";
char * n = "d";
m = n;
cout<<m[0]<<endl;//输出d
return 0;
}
注:利用上面的程序,虽然我们运行成功了,也改变了这个值,但是这种做法是极度不好的,有多极度?在公司写这种程序,可能会直接开了你。利用指针赋值直接让一个字符串强行野蛮覆盖另一个字符串,这可能会导致部分字符串直接乱码,我们这里可以打印m[2]和m[3]尝试下,这里m的长度为4,其中m[1]为 '\0' 。
4.char*初始化
这个经常用,所记录下。
如果我们在一个函数需要返回一个字符串的话,要么使用char*这种指针,要么接的是指针,引用也可以,但是就是字符数组不可以,因为字符数组属于局部变量,函数结束时,即销毁,所以返回为空。代码如下:
#include <iostream>
using namespace std;
char* myChar(int N)
{
char * ans = new char[26];
ans[N] = '\0';
//char ans[N];//不能用字符数组,这里使用指针,新开辟了一段空间
for(int i = 0; i<N; i++)
*(ans+i) = 'A'+i;
return ans;
}
void myChar2(int N,char * ans)
{
ans[N] = '\0';
for(int i = 0; i<N; i++)
*(ans+i) = 'A'+i;
}
int main()
{
cout<<myChar(26)<<endl;
char * ans2 = new char[26];
myChar2(26,ans2);
cout<<ans2<<endl;
return 0;
}
一般可以返回的有如下:
1 全局变量,或者全局变量空间内的一个地址。
2 静态局部变量,或者静态局部变量内部的一个地址。
3 参数传入,利用引用或者指针。
4 动态申请的空间首地址。
5.char*与string相互转化
5.1 char* => string
int main()
{
char * m = "abcde";
//string s(m);
string s = m;
cout<<s<<endl;
return 0;
}
5.2 string => char*
int main()
{
string str = "abcd";
const char *s = str.c_str(); //c_str()返回const char *类型
cout<<s<<endl;//输出abcd
return 0;
}