字符串类型相关

前言

做了个笔试题,最后一题卡在char相关转换的问题上,笔者直接心态崩了,这里对于C还是不熟悉,所以特地写下这个博客,希望好好掌握char类型。

引用看学习视频中老师的一句话:一个普通程序员在企业中 90%的精力,都花在了字符串的处理上。

从上面这句话,我们足以能看出字符串的重要性,这也决定了字符串在各大面试和笔试中,都极易考到

 

目录

1.char类型

2.字符串类型

3.如何处理字符串常量

4.char*初始化

5.char*与string相互转化

5.1 char* =>  string

5.2  string => char*


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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值