首页 > 编程语言 >C++基础——字符串(C语言和C++的字符串风格区别)

C++基础——字符串(C语言和C++的字符串风格区别)

时间:2024-04-06 22:01:19浏览次数:23  
标签:std const string str1 C++ C语言 char 字符串

C 语言风格的字符串

字符串通常是以字符数组或字符指针的形式表示的。

字符串以空字符('\0')结尾!!!

两种形式:

(1)字符指针形式的字符串

char str[] = "Hello C++";

(2)字符数组形式的字符串

char *ptr = "Hello C++";

C风格字符串的运算

运算需要使用string函数,需要加入头文件<string.h>

字符串长度

size_t strlen(const char *s): 返回字符串s的长度,不包括结尾的空字符。

字符串拷贝

char *strcpy(char *dest, const char *src): 把src所指向的字符串复制到dest。
char *strncpy(char *dest, const char *src, size_t n): 把src所指向的字符串的前n个字符复制到dest。

strcpy 函数在 C 语言中用于将一个字符串复制到另一个字符串中,并且会覆盖目标字符串中的内容。

字符串连接

char *strcat(char *dest, const char *src): 把src所指向的字符串追加到dest所指向的字符串的结尾。
char *strncat(char *dest, const char *src, size_t n): 把src所指向的字符串的前n个字符追加到dest所指向的字符串的结尾。

字符串比较

int strcmp(const char *s1, const char *s2): 比较s1和s2。
int strncmp(const char *s1, const char *s2, size_t n): 比较s1和s2的前n个字符。
int strcasecmp(const char *s1, const char *s2): 比较s1和s2,不区分大小写(在某些平台上可用,但不是C标准的一部分)。

查找字符串中的字符或子串

char *strchr(const char *s, int c): 在字符串s中查找第一次出现字符c的位置。
char *strrchr(const char *s, int c): 在字符串s中查找最后一次出现字符c的位置。
char *strstr(const char *s1, const char *s2): 在字符串s1中查找第一次出现子串s2的位置。

其他函数

void *memchr(const void *s, int c, size_t n): 在内存的前n个字节中查找第一次出现值为c的位置。
int memcmp(const void *s1, const void *s2, size_t n): 比较内存区域s1和s2的前n个字节。
void *memcpy(void *dest, const void *src, size_t n): 从源内存块src复制n个字节到目标内存块dest。
void *memmove(void *dest, const void *src, size_t n): 从源内存块src复制n个字节到目标内存块dest,即使源和目标内存块重叠也安全。

这些函数如果想要在C++中运用的话需要加上头文件即可使用

#include<cstring>


C++语言风格的字符串

(使用string字符串更加便捷,安全)

std::string 是一个类,它定义在 <string> 头文件中,用于表示和操作字符串

std::vector<char>的功能增强版就是std::string

使用string和其成员函数需添加头文件的#include<string>

string定义字符串

格式:std::string 字符串名;

string还可以定义字符串数组

格式:std::string 字符串数组名(数组大小); 

string类的初始化

可以用=或者{}进行赋值,可以进行相同连续的赋值

#include <iostream>
#include <string>
int main()
{
    std::string str1;               // 创建一个空字符串  
    std::string str2 = "Hello";    // 使用字符串字面量初始化  
    std::string str3(str2);        // 使用另一个字符串对象初始化  
    std::string str4(5, 'c');      // 创建包含5个字符'c'的字符串
    return 0;
}

相对于C风格的字符串运算string的运算更加简便和安全

string类的常用操作

连接

使用 + 运算符或 append() 方法连接字符串。

std::string str1 = "Hello";
std::string str2 = "C++";
std::string str3 = str1 + " " + str2; // "Hello C++"
str1.append(" C++"); // str1 现在也是 "Hello C++"

比较

直接使用比较运算符比较字符串。

if (str1 == str2)
{
// 字符串相等
} else if (str1 < str2) 
{
// str1 小于 str2
}

访问字符

使用下标运算符或 at() 方法访问特定位置的字符。

char ch = str1[0]; // 获取第一个字符
char ch2 = str1.at(0); 
// 同样获取第一个字符,但会进行范围检查

//at不会使用溢出

子字符串查找

使用 find() 方法查找子字符串的位置。

size_t pos = str1.find("World"); 
// 返回子字符串在 str1 中的位置,如果没找到则返回 std::string::npos

修改字符串

使用 replace() 方法替换子字符串,或使用赋值运算符修改特定位置的字符。

str1.replace(pos, 5, "C++"); // 从 pos 开始,替换 5 个字符为 "C++"
str1[0] = 'h'; // 修改第一个字符为 'h'

大小

使用 size() 或 length() 方法获取字符串的长度。

size_t len = str1.size(); // 获取字符串长度
size_t len = str.length(); // 获取字符串的长度

插入和删除

使用 insert() 方法在字符串中插入字符或子字符串,使用 erase() 方法删除字符或子字符串。

str1.insert(0, "Hi "); // 在字符串开头插入 "Hi "
str1.erase(0, 2); // 删除前两个字符

其他功能

std::string 还提供了其他方法,如 substr()(获取子字符串)、swap()(交换两个字符串的内容)等。

标签:std,const,string,str1,C++,C语言,char,字符串
From: https://blog.csdn.net/2301_80158456/article/details/136835128

相关文章

  • Android Graphics 多屏同显/异显 - C++示例程序(标准版)
    ”为了理解Android多屏同显/异显的基本原理,我们将从NativeLevel入手,基于GraphicsAPIs写作一个简单的C++版本的多屏显示互动的演示程序。通过这个程序我们将了解常用的多屏显示相关的接口的使用方法。“  01多屏显示C++示例概况 源码下载请查看文章末尾源码下载方......
  • C++基础知识整理
    1.CPP编译链接过程2.new和malloc区别,delete和free区别3.指针和引用4.左值引用和右值引用5.const6.函数重载7.函数调用栈帧开辟过程8.inline内联函数9.static关键字10.定义指向类的成员的指针11.this指针12.常成员方法13.函数模板与类模板函数模板类......
  • C++从入门到精通——初步认识面向对象及类的引入
    初步认识面向对象及类的引入前言一、面向过程和面向对象初步认识C语言C++二、类的引入C++的类名代表什么示例C++与C语言的struct的比较成员函数访问权限继承默认构造函数默认成员初始化结构体大小总结前言面向过程注重任务的流程和控制,适合简单任务和流程固定的......
  • c++算法学习笔记 (20) 哈希表
    1.模拟散列表//拉链法#include<bits/stdc++.h>usingnamespacestd;constintN=100003;inth[N];inte[N],ne[N],idx;//存链voidinsert(intx){intk=(x%N+N)%N;//让负数的余数变成正数(若直接加N,则可能溢出)e[idx]=x;ne[idx]......
  • c++算法学习笔记 (21) STL
    1.vector:        变长数组,倍增的思想        size()返回元素个数        empty()返回是否为空        clear()清空        front()/back()元素        push_back()/pop_back()        begin()/end()迭代器 ......
  • c++算法学习笔记 (19) 堆
    1.堆排序:(1)插入一个数:heap[++size]=x;up(size);//在最后插入,再往上移(2)求集合中最小值:heap[1](3)删除最小值:swap(heap[1],heap[size]);size--;down(1);//将最小值移到最后直接删除,再将heap[1]下移到合适位置(4)删除任意一个元素:swap(heap[k],heap[size]);size--;down(1)orup(1);/......
  • 调换任意字符串位置
    对任意字符串取反,就是首元素和尾元素依次调换,最关键就是要调换几次。先用(需要#inclide<string.h>头文件)strlen()获取字符数组的字符长度,再通过取中间数。例如字符长度为3,则需要循环3/2次,就是一次,只需将下标为0和下标为2的元素对换就可以了。互换过程:char c[3]={0};chart=c[......
  • C/C++预处理过程
    目录前言:1.预定义符号2. #define定义常量3. #define定义宏4.带有副作用的宏参数5.  宏替换的规则6. 宏和函数的对比7.#和##8. 命名约定9. #undef10. 命令行定义11. 条件编译12. 头文件的包含13. 其他预处理指令总结:。前言:本篇介绍c/c+......
  • C++模版简单认识与使用
    目录前言:1.泛型编程2.函数模版3.类模版为什么要有类模版?使用typedef不行吗?类模版只能显示实例化:注意类名与类型的区别:注意类模版最好不要声明和定义分离:总结:前言:正如标题而言,这里只是对模版的简单认识与使用,方便后面博客介绍stl中一些容器的实现,更复杂详细的模版......
  • C语言之易错知识点统计
    hello,铁汁们,大家好呀,我是脆皮炸鸡。今天是4,6号,发现了很多自己以前没有意识到的知识点误区,记录下来和大家分享一下,由于我的水平有限,难免会出错。若是有什么错误,恳请大家告知,在这里多谢大家啦!大家有什么易错点也可以在评论区分享一下呦。C语言规定,在一个源程序中,main函数......