首页 > 编程语言 >C++自学笔记16(字符串与字符串字面量)

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

时间:2024-07-25 09:54:47浏览次数:18  
标签:std name 16 C++ char 字符串 include shaojie

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

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

字符串实际上就是字符组成的数组或指针(数组就是指针的一种)。

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

字符串变量

在之前我们常常用const char* name;表示不可修改的字符指针,这是C语言的定义字符串方式。

#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类,这是C++定义方式

#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();
}

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

标签:std,name,16,C++,char,字符串,include,shaojie
From: https://blog.csdn.net/weixin_64418869/article/details/140670979

相关文章

  • C++11——lambda表达式
    一、前言在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。intmain(){ intarray[]={4,1,8,5,3,7,0,9,2,6}; //默认按照小于比较,排出来结果是升序 sort(array,array+sizeof(array)/sizeof(array[0])); //如果需要降序,需要改变元素......
  • binascii.Error:无效的 base64 编码字符串:数据字符数 (41) 不能多于 1 4 的倍数
    我正在尝试使用py-vapid、pywebpush和django-push-notifications通过Webpush发送通知。当我尝试从django管理网站发送测试通知时,我在控制台中收到此回溯日志:|InternalServerError:/djangoadmin/push_notifications/webpushdevice/......
  • C++学习笔记(03)——通讯录管理系统设计
    记录一下利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人显示联系人:显示通讯录中所有联系人信息删除联系人:按照姓名进行删除指定联系人查找联系人:按照姓名查看指定联系人......
  • 卡皮巴拉(c++)
    题目描述有一种卡皮巴拉玩偶,它有头、身体、四肢三个部分,每个部分需要使用不同的材料制作。玩具公司生产了很多批次的卡皮巴拉玩偶,每个批次的玩偶的三个部分都分别有多种款式(每种款式只需使用一种材料)。现在有`k`批次的卡皮巴拉玩偶,每个批次的玩偶的头、身体和四肢的款式分别......
  • 成员函数(c++)
    题目描述针对上一题的情形,除了在结构体外新设计一个函数 get_grade 外,我们可以用另外一种方法,给类添加一个成员函数,如下所示。structStudent{intx;inty;intz;intget_grade(){//todo}};此后,对于每一个 Student 类的对象 s,我们可以......
  • 图的最短路径算法(SPFA,Dijkstra,Bellman_Ford)(迪杰斯特拉算法,Spfa算法,贝尔曼-福特算
    目录Dijkstra迪杰斯特拉算法写法时间复杂度例题描述输入描述输出描述样例输入用例输出用例写法Spfa算法例题描述输入描述输出描述样例输入用例输出用例写法Bellman_Ford算法(贝尔曼-福特算法)写法例题描述输入描述输出描述样例输入样例输出样例......
  • Python XML 解析:字符串中的“<”被阻塞
    我有一个使用ET.XMLParser来解析CppCheckXML报告文件的Python模块。当尝试解析字符串中包含“<”的XML元素中的属性之一时,它会令人窒息,它会将其解释为格式错误的XML,例如:<errormsg="Includefile<iostream>notfound.">(注意字符和“iostream”之间的空格必须放......
  • 【知识扩展】C/C++编译原理
    C/C++编译原理一、前言二、编译原理1、预处理2、编译3、汇编4、链接三、头文件和库文件1、头文件2、库文件四、编译器1、GCC编译器1.1、编译过程1.1.1、预处理1.1.2、编译1.1.3、汇编1.1.4、链接1.2、创建静态库1.2.1、静态库源码编译成.o的文件1.2.2、编译静态库1.......
  • 【 Pro*C/C++ 】 Pro*C/C++ 编程
    ProC/C++编程1一、ProC/C++简介11.1、ProC/C++是什么11.2、ProC/C++处理流程2二、ProC/C++GCC环境配置32.1、ProC/C++预编译环境32.2、GCC编译器5三、开始编写第一个ProC++代码53.1、第一个ProC++代码53.2、ProC++代码预编译63.3、GCC编译73......
  • C++语法10:C++实现0-1背包问题的动态规划解法
    动态规划(DynamicProgramming):解锁复杂问题的钥匙在算法设计与分析的广阔领域中,动态规划(DynamicProgramming,DP)无疑是一把锋利的剑,用于斩断复杂问题中缠绕的荆棘。它通过将大问题分解为小问题,并存储子问题的解来避免重复计算,从而高效地解决了一系列看似无解的难题。本文将从......