当我们想在电脑上以文本方式表示东西时,一个单词、一个句子、一大段文章都叫做字符串。
字符串就是为了我们去处理文字文本的方法。
字符串实际上就是字符组成的数组或指针(数组就是指针的一种)。
(有人会问数组不是储存数字么?怎么储存字符?因为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