首页 > 编程语言 >C++ 字符串(string)常用操作总结

C++ 字符串(string)常用操作总结

时间:2024-03-03 22:55:18浏览次数:24  
标签:字符 string s2 s1 args C++ 字符串

转载自知乎回答:https://zhuanlan.zhihu.com/p/553061732

由单引号括起来的一个字符被称作 char 型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。字符串字面值的类型实际上就是由常量字符构成的数组,,编译器在每一个字符串后面添加一个空字符('\0'),因此字符串的实际长度要比他的内容多1。

如字面值 'A' 表示的就是单独字符 A ,而字符串 "A" 代表了一个包含两个字符的字符数组,分别是字母 A 和空字符。

0、常用功能汇总

img

1、定义一个字符串

使用标准库类型 string 声明并初始化一个字符串,需要包含头文件 string。可以初始化的方式如下:

    string s1;    // 初始化一个空字符串
    string s2 = s1;   // 初始化s2,并用s1初始化
    string s3(s2);    // 作用同上
    string s4 = "hello world";   // 用 "hello world" 初始化 s4,除了最后的空字符外其他都拷贝到s4中
    string s5("hello world");    // 作用同上
    string s6(6,'a');  // 初始化s6为:aaaaaa
    string s7(s6, 3);  // s7 是从 s6 的下标 3 开始的字符拷贝
    string s8(s6, pos, len);  // s7 是从 s6 的下标 pos 开始的 len 个字符的拷贝

使用 = 的是拷贝初始化,使用 () 的是直接初始化。当初始值只有一个时,两者都可。当初始值有多个时一般来说要使用直接初始化,如上述最后一个的形式

2、读写 string 操作

输入时遇到空格或回车键将停止。但需要注意的是只有按下回车键时才会结束输入执行,当按下空格后还能继续输入,但最终存到字符串中的只是第一个空格之前输入的字符串(开头的空白除外,程序会自动忽略开头的空白的),空格操作可以用来同时对多个字符串进行初始化,如下例

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    string s1, s2, s3;    // 初始化一个空字符串
    // 单字符串输入,读入字符串,遇到空格或回车停止
    cin >> s1;  
    // 多字符串的输入,遇到空格代表当前字符串赋值完成,转到下个字符串赋值,回车停止
    cin >> s2 >> s3;  
    // 输出字符串 
    cout << s1 << endl; 
    cout << s2 << endl;
    cout << s3 << endl;   
    return 0;
}
// 运行结果 //
  abc def hig
abc
def
hig

如果希望在最终读入的字符串中保留空格,可以使用getline函数,例子如下:

#include <iostream>
#include <string>
 
using namespace std;
 
int main(void)
{
    string s1 ;    // 初始化一个空字符串
    getline(cin , s1); 
    cout << s1 << endl;  // 输出
    return 0;
}
// 结果输出 //
abc def hi
abc def hi

3、查询字符串信息、索引

可以用 empty size/length 查询字符串状态及长度,可以用下标操作提取字符串中的字符。

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    string s1 = "abc";    // 初始化一个字符串
    cout << s1.empty() << endl;  // s 为空返回 true,否则返回 false
    cout << s1.size() << endl;   // 返回 s 中字符个数,不包含空字符
    cout << s1.length() << endl;   // 作用同上
    cout << s1[1] << endl;  // 字符串本质是字符数组
    cout << s1[3] << endl;  // 空字符还是存在的
    return 0;
}
// 运行结果 //
0
3
3
b

4、拼接、比较等操作

s1+s2          // 返回 s1 和 s2 拼接后的结果。加号两边至少有一个 string 对象,不能都是字面值
s1 == s2       // 如果 s1 和 s2 中的元素完全相等则它们相等,区分大小写
s1 != s2
<, <=, >, >=   // 利用字符的字典序进行比较,区分大小写

5、cctype 头文件(判断字符类型:大/小写字母、标点、数字等)

cctype 头文件中含有对 string 中字符操作的库函数,如下:

isalnum(c)  // 当是字母或数字时为真
isalpha(c)  // 当是字母时为真
isdigit(c)  // 当是数字是为真
islower(c)  // 当是小写字母时为真
isupper(c)  // 当是大写字母时为真
isspace(c)  // 当是空白(空格、回车、换行、制表符等)时为真
isxdigit(c) // 当是16进制数字是为真
ispunct(c)  // 当是标点符号时为真(即c不是 控制字符、数字、字母、可打印空白 中的一种)
isprint(c)  // 当时可打印字符时为真(即c是空格或具有可见形式)
isgraph(c)  // 当不是空格但可打印时为真
iscntrl(c)  // 当是控制字符时为真
tolower(c)  // 若c是大写字母,转换为小写输出,否则原样输出
toupper(c)  // 类似上面的

6、for 循环遍历

可以使用 c++11 标准的 for(declaration: expression) 形式循环遍历,例子如下:

如果想要改变 string 对象中的值,必须把循环变量定义为引用类型

#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main(void)
{
    string s1 = "nice to meet you~";    // 初始化一个空字符串
    // 如果想要改变 string 对象中的值,必须把循环变量定义为引用类型。引用只是个别名,相当于对原始数据进行操作
    for(auto &c : s1)  
        c = toupper(c); 
    cout << s1 << endl; // 输出
    return 0;
}
// 运行结果 //
NICE TO MEET YOU~

7、修改 string 的操作

在 pos 之前插入 args 指定的字符。pos是一个下标或者迭代器。接受下标的版本返回一个指向 s 的引用;接受迭代器的版本返回一个指向第一个插入字符的迭代器

s.insert(pos, args)  
// 在 s 的位置 0 之前插入 s2 的拷贝
s.insert(0, s2)  

删除从 pos 开始的 len 个字符。如果 len 省略,则删除 pos 开始的后面所有字符。返回一个指向 s 的引用。

s.erase(pos, len)

将 s 中的字符替换为 args 指定的字符。返回一个指向 s 的引用。

s.assign(args)

将 args 追加到 s 。返回一个指向 s 的引用。args 不能是单引号字符,若是单个字符则必须用双引号表示。如,可以是 s.append("A") 但不能是 s.append('A')

s.append(args)

将 s 中范围为 range 内的字符替换为 args 指定的字符。range 或者是一个下标或长度,或者是一对指向 s 的迭代器。返回一个指向 s 的引用。

s.replace(range, args) 
// 从位置 3 开始,删除 6 个字符,并插入 "aaa".删除插入的字符数量不必相等
s.replace(3, 6, "aaa")  

8、string 搜索操作

搜索操作返回指定字符出现的下标,如果未找到返回 npos

s.find(args)  // 查找 s 中 args 第一次出现的位置
s.rfind(args)  // 查找 s 中 args 最后一次出现的位置

在 s 中查找 args 中任何一个字符 最早/最晚 出现的位置

s.find_first_of(args)  // 在 s 中查找 args 中任何一个字符最早出现的位置
s.find_last_of(args)  // 在 s 中查找 args 中任何一个字符最晚出现的位置
例如:
string s1 = "nice to meet you~"; 
cout << s1.find_first_of("mey") << endl; // 输出结果为 3,'e' 出现的最早

在 s 中查找 第一个/最后一个 不在 args 中的字符的位置

s.find_first_not_of(args)  // 查找 s 中 第一个不在 args 中的字符的位置
s.find_last_not_of(args)  // 查找 s 中 最后一个不在 args 中的字符的位置
例如:
string s1 = "nice to meet you~";  
cout << s1.find_first_not_of("nop") << endl; // 输出结果为 1 ,'i' 不在 "nop" 里

9、string、char 型与数值的转换

1、将数值 val 转换为 string 。val 可以是任何算术类型(int、浮点型等)。

string s = to_string(val)

2、转换为整数并返回。返回类型分别是 int、long、unsigned long、long long、unsigned long long。b 表示转换所用的进制数,默认为10,即将字符串当作几进制的数转换,最终结果仍然是十进制的表示形式 。p 是 size_t 指针,用来保存 s 中第一个非数值字符的下标,默认为0,即函数不保存下标,该参数也可以是空指针,在这种情况下不使用。

stoi(s)
// 函数原型 int stoi (const string&  str, size_t* idx = 0, int base = 10);
stoi(s, p, b)
stol(s, p, b)
stoul(s, p, b)
stoll(s, p, b)
stoull(s, p, b)
// 例如
string s1 = "11";    // 初始化一个空字符串
int a1 = stoi(s1);
cout << a1 << endl; // 输出 11
int a2 = stoi(s1, nullptr, 8);
cout << a2 << endl; // 输出 9
int a3 = stoi(s1, nullptr, 2);
cout << a3 << endl; // 输出 3

3、转换为浮点数并返回。返回类型分别是 float、double、long double 。p 是 size_t 指针,用来保存 s 中第一个非数值字符的下标,默认为0,即函数不保存下标,该参数也可以是空指针,在这种情况下不使用。

stof(s)
stof(s, p)
stod(s, p)
stold(s, p)

4、char 型转数值。注意传入的参数是指针类型,即要对字符取地址

atoi(c)
// 函数原型 int atoi(const char *_Str)
atol(c)
atoll(c)
atof(c)

10、字符串反转

使用 头文件中的 reverse() 方法:

    string s2 = "12345";    // 初始化一个字符串
    reverse(s2.begin(), s2.end()); // 反转 string 定义的字符串 s2 
    cout << s2 << endl; // 输出 54321

11、提取字串

使用 string ss = s.substr(pos, n) 。从索引 pos 开始,提取连续的 n 个字符,包括 pos 位置的字符。

标签:字符,string,s2,s1,args,C++,字符串
From: https://www.cnblogs.com/hazy-star/p/18050928

相关文章

  • C++基本知识梳理
    一.命名空间概念:命名空间是新定义的一个作用域,里面可以放函数,变量,定义类等,主要用来防止命名冲突.实现:namespace关键字命名空间名字{命名空间成员}注意点:1.命名空间可以嵌套使用,还可以使用inline关键字实现版本控制(inline修饰的命名空间默认展开到外一层命名空......
  • C++ 接口(抽象类) 虚函数
    接口描述了类的行为和功能,而不需要完成类的特定实现。C++接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用"=0"来指定的clas......
  • C++网上购书系统项目的二次开发
    1.来源该项目来自同学以前的期末大作业:网上购书系统项目。2.运行环境及运行结果(1)运行环境:DevC++(2)运行结果:代码如下:点击查看代码#include<iostream>#include<string>#include<fstream>#include<vector>#include"buyer.h"#include"book.h"#include"order.h&q......
  • Sofia and Strings(字符串,思维)
    SofiaandStrings题面\(t\)组数据。每一次测试,有长度为\(n\)的序列\(s\),长度为\(m\)的序列\(t\)。你可以对\(s\)进行两种操作:删除\(s_i,1\lei\le|s|\)(\(s\)从\(1\)开始标号).将\(s_l,s_{l+1},\dots,s_r\)排序(\(1\lel\ler\le|s|\))。上面\(|s|\)......
  • ABC343 G Compress Strings 题解
    QuestionABC343GCompressStrings给定\(N\)个字符串\(S_1,S_2,\cdots,S_N\)找到一个包含所有这些字符串作为子字符串的最小长度的字符串一个字符串\(S\)包含一个字符串\(T\)作为子字符串是指:如果\(T\)可以通过从\(S\)的开头删除零个或多个字符以及从末尾删除......
  • c++复习笔记——STL(vector)
    c++-----STL容器系列(1)vector1介绍Vector是stl容器中一种常见的容器,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vector预定值时vector将自动扩容。Vector是一种顺序存储器,在内存中连续排列,可以通过下标访问,时间复杂度为O(1)。2创建和使用使用......
  • C++ 函数调用运算符 () 重载
    函数调用运算符()可以被重载用于类的对象。当重载()时,您不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;/......
  • C++ 赋值运算符'='重载
    C++拷贝构造函数(初学有点难理解)就像其他运算符一样,可以重载赋值运算符(=),用于创建一个对象,比如拷贝构造函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;//0到无穷7intinches;......
  • C++ ++ 和 -- 运算符重载
    原文递增运算符(++)和递减运算符(--)是C++语言中两个重要的一元运算符。1、递增和递减一般是改变对象的状态,所以一般是重载为成员函数。2、重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),......
  • C++中UNIX时间戳与日期互转
    C++中UNIX时间戳与日期互转使用time.h头文件localtime可以把时间戳转为tm结构体,tm结构体中可以格式化输出时间mktime可以把tm结构体转为时间戳tm结构体中:year需要+1900,tm_mon的范围是0-11,tm_mday的范围是1-31structtm{inttm_sec;//secondsaftert......