[C++从入门到精通] 3.string类型的相关用法

简介: [C++从入门到精通] 3.string类型的相关用法

一. C++基本变量类型

  • 基本类型:int、double等。
  • 复合类型:引用、指针、const等。
  • 标准库类型:string(可变长字符串的处理)、vector(一种集合或容器的概念)、迭代器。

对于字符串,在现实生活中,string字符串无处不在。包括我们说的每一句话,例如,baidu.com,甚至写的文字也算是字符串的一种。


二. String对象的定义和初始化

① 使用string类型前要

#include <string>
using namespace std;  //不包含该命名空间的话,需要使用std::string声明

② 定义和初始化string对象

string s1;                   //默认初始化,s1 = “”,表空串,里面没有字符
string s2("I Love China");   //把I Love China这个字符串内容拷贝到了s2代表的一段内存中,拷贝时不包括末尾的\0(字符串常量末尾默认有一个\0)
string s3 = "I Love China";  //跟s2的写法效果一样
string s4 = s2;              //把s2中的内容拷贝到了s4代表的一段内存中,但两者内存地址不同
string s5(3, 'a');           //把s5初始化为连续3个字符‘a’组成的字符串,即s5 = “aaa”,这种方式不太推荐,因为会在系统内部创建临时对象,有点影响效率

三. String对象的操作

判断是否为空empty(),返回bool类型

std::string s1;
if(s1.empty())
{
    //字符串s1为空成立
}

size()length():返回字节/字符数量,代表该字符串的长度(unsigned int

string s1;
qDebug() << "s1的字符长度:" << s1.size();    //s1的字符长度:0
qDebug() << "s1的字符长度:" << s1.length();  //s1的字符长度:0
string s2 = "我是牛马!";
qDebug() << "s2的字符长度:" << s2.size();    //s2的字符长度:9
qDebug() << "s2的字符长度:" << s2.length();  //s2的字符长度:9

s[n]:返回s中的第n个字符(n是个整型值),n代表的是一个位置,位置从0开始,到.size()-1结束

string s4 = "I Love China!";
if(s4.size() > 4)
{
    qDebug() << "s4[4] = " << s4[4];  //s4[4] = v
    s4[4] = 'w';       
    qDebug() << "s4 = " << s4;        //s4 = "I Lowe China!"
}

s1+s2:字符串的连接,返回连接后的结果,其实就是得到一个新的string对象

string s5 = “abcd”;
string s6 = “abcd”;
string s7 = s5 + s6;   
qDebug() << "s7 = " << s7;  //s7 = "abcdabcd"

s1 = s2:字符串对象赋值,s1里的内容被s2里面的内容所取代。


s1 == s2判断两个字符串是否相等(长度+字符同),大小写敏感(大小写字符是两个不同的字符)。


s.c_str():将string类型转换成const char *

string s8 = "abc";
const char *p = s8.c_str();   //p指向s8的内存地址,内容也是"abc"
char str[100];
strcpy_s(str, sizeof(str), p);  
qDebug() << "str = " << str;  //str = "abc"

.c_str的引入是为了与C语言兼容,在C语言中没有string类型,所以我们得通过string类对象的c_str()成员函数把string对象转换成C语言中的字符串样式。

我们在研究研究这段函数里面的内存情况,感兴趣的可以看看:

通过在内存窗口输入&s8,得到s8的内存地址为0x010FFC6C(打开内存窗口方式:调试——窗口——内存——内存)

内存地址0x010FFC6C中结尾6C代表上面右边内存???.abc.???中的第一位,而const char *p = s8.c_str();中指针p指向s8中字符串真正的内存地址,所以应该是从6C开始跳过4位的a开始,所以指针p的内存地址为0x010ffc706C70相差就是4字节)。

strcpy_s(str, sizeof(str), p);将指针p中的内存赋值给字符数组str,其内的61 62 63代表abc00代表结束符/0

ps:因为对象中可能包含其他东西,所以内存中的或其他乱码是正常的。


⑧ 针对string使用范围for语句

范围for:C++11中提供的一种能够遍历一个序列中的每一个元素的方法。

string s9 = "I Love China";
for(auto c : s9)     //auto:编译器自动推断变量c的类型,并为其不断分配内存,直到遍历结束
{
    qDebug() << c;  //依次输出s9里面的内容
}

利用范围for语句,修改string中的内容

string s9 = "I Love China";
for(auto &c : s9)     //这里使用取地址符号,即c相当于s9中内容的别名,直接取代
{
    c = toupper(c);   //因为c是一个引用,所以这相当于改变s9中的值
                      //toupper():把小写字符转成大写,大写字符没变化
    qDebug() << c;    //输出:I LOVE CHINA
}

注:for(auto c : s9)for(auto &c : s9)相比,更推荐后置,引用方式更高效。


下雨天,最惬意的事莫过于躺在床上静静听雨,雨中入眠,连梦里也长出青苔。


目录
相关文章
|
9天前
|
存储 安全 编译器
第二问:C++中const用法详解
`const` 是 C++ 中用于定义常量的关键字,主要作用是防止值被修改。它可以修饰变量、指针、函数参数、返回值、类成员等,确保数据的不可变性。`const` 的常见用法包括:
45 0
|
1月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
30 3
【C++】map、set基本用法
|
28天前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
68 5
|
29天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
9天前
|
C++
第十三问:C++中静态变量的用法有哪些?
本文介绍了 C++ 中静态变量和函数的用法及原理。静态变量包括函数内的静态局部变量和类中的静态成员变量,前者在函数调用间保持值,后者属于类而非对象。静态函数不能访问非静态成员,但可以通过类名直接调用。静态链接使变量或函数仅在定义文件内可见,避免命名冲突。
21 0
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
29 1
|
2月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
29 0
|
2月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
39 0
|
2月前
|
C语言 C++
深度剖析C++string(中)
深度剖析C++string(中)
58 0
|
2月前
|
存储 编译器 程序员
深度剖析C++string(上篇)(2)
深度剖析C++string(上篇)(2)
44 0