C++自学笔记16(字符串与字符串字面量)

当我们想在电脑上以文本方式表示东西时,一个单词、一个句子、一大段文章都叫做字符串。

字符串就是为了我们去处理文字文本的方法。

字符串实际上就是字符组成的数组或指针(数组就是指针的一种)。(有人会问数组不是储存数字么?怎么储存字符?因为ASCLL码表将所有字母、数字、符号翻译成数字了。根据不同的16位、32位等等转化为不同的数字)

字符串变量

在之前我们常常用const char* name;表示不可修改的字符指针

#include <iostream>

int main ()
{
    const char* name ="shaojie";
    std::cin.get();
}

 使用const目的是创建一个不可修改的“只读”量,意味着name这个字符串不可被扩展或删减。

#include <iostream>

int main ()
{
    const char* name ="shaojie";
    char name[0] = 'z';
    std::cin.get();
}

因为const的存在我们就不可以修改字符串,以上代码也就会报错。如果让字符串可修改那就去掉const。(然而对指针进行修改依旧有错误不建议使用)

我们说字符串是包含字符的数组或指针,那么我们用数组写一下字符串。

#include <iostream>

int main ()
{
    char* name ="shaojie";
    char name1[8] = {'s','h','a','o','j','i','e','0'};
    std::cout<<name<<std::endl;

    std::cin.get();
}

两个东西打印出的都是shaojie,我们可以看到在使用name1数组时,在末尾我们传输了一个0,这意味着字符输入结束,而name本身自带一个0,就是说shaojie本身由7个字节组成的数组。

std::string

在讲到虚函数时我们用到<string>文件下的std::string类,

#include <iostream>
#include <string>
int main ()
{
    std::string name ="shaojie";
    std::cout<<name<<std::endl;

    std::cin.get();
}

 最后的效果都是打印出了shaojie,那我们为什么还要这样用呢?

string文件下的类有一个构造函数,他接受传入为char* 和 const char*作为参数。仅仅这一个优点么?当然不止,string类还有许多函数

#include <iostream>
#include <string>
int main ()
{
    std::string name ="shaojie";
    int StringSize = name.size();
   
    std::cout<<name<<StringSize <<std::endl;

    std::cin.get();
}

假如我们要知道字符串的大小,我们就可以直接调用string文件中的size()函数。

只用c++自带的函数也可以计算,如下函数。还是只要使用次数变多代码就不好维护,所以我们使用string类。

#include <iostream>
#include <string>
int main ()
{
    //std::string name ="shaojie";
    //int StringSize = name.size();
    char* s;
    strlen(s);
    //std::cout<<name<<StringSize <<std::endl;

    std::cin.get();
}

 总的来说std::string下创建的字符串,使用函数更加便捷,参考类的优点。

那如果const char*name就是要扩展字符串呢?

#include <iostream>
#include <string>
int main ()
{
   std::string name ="shaojie"+"shixiaobai";
   std::cout<<name<<std::endl;

   std::cin.get();
}

按照以上这么写吗?显然这是错误的。“”内部是字符串字面量实际上就是数组和指针。我们说name是一个包含字符的数组,而数组又是指针变量,指针和指针可以相加吗?显然不可以。那要怎么做呢?

#include <iostream>
#include <string>
int main ()
{
   std::string name ="shaojie";
   name +="shixiaobai";
   std::cout<<name<<std::endl;

   std::cin.get();
}

我们将shixiaobai加入name并赋值给name,这样就完成了字符串拓展。或者我们将

#include <iostream>
#include <string>
int main ()
{
   std::string name =std::string("shaojie")+"shixiaobai";
   std::cout<<name<<std::endl;

   std::cin.get();
}

shaojie 变为string对象加上“shixiaobai”这个数组,也可以达到同样效果。用构造函数将“shaojie”包围起来,使之成为一个string对象。

字符串作为一种特殊的字符数组,特点就是末尾带“0”,方便我们用if判断到0时结束字符串的输入或输出。

字符串字面量

“shaojie”这就是一个字符串字面量。用“”括起来、程序执行过程中保持不变(这就是为什么常加const)、编译器将其看做char*类型指针或者char的数组。

在标准库下其默认是const char[8].还记得字符串后边自带\0(空终止符)作为判断字符串输入输出依据。

#include <iostream>
#include <string>

#include<stdlib.h>

int main ()
{
   const char name[8] ="shaojie";

   std::cout<<strlen(name)<<std::endl;

   std::cin.get();
}

在标准库下,使用strlen计算出长度为7,这就是字符串的长度。我们需要知道他有8个字节最后位数是0,并以此判断即可。

我们将char类型换成char*,对第一位进行修改,这其实是不合法的。

#include <iostream>
#include <string>

#include<stdlib.h>

int main ()
{
   char* name ="shaojie";
   char name[0] = 'z';
   std::cout<<strlen(name)<<std::endl;

   std::cin.get();
}

因为你取了一个指向字符串字面变量的内存位置的指针,但是字符串字面变量是存储在内存的只读部分。对于只读部分我们进行修改显然是不合适的,那我们要如何修改呢?使用数组

#include <iostream>
#include <string>

#include<stdlib.h>

int main ()
{
   char name[] ="shaojie";
   name[0] = 'z';
   std::cout<<strlen(name)<<std::endl;

   std::cin.get();
}

 对于数组内改变显然是没有问题的。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值