C++ 字符串与字符数组

C++中的字符串和字符数组都用于存储文本数据,但它们有一些重要的区别。以下是关于C++字符串和字符数组的详细解释:

一、字符数组(Character Array)

字符数组是由一系列字符组成的数据结构,以null字符(‘\0’)作为结尾。

声明和初始化:

// 自动计算长度,包括结尾的空字符
char charArray[] = "Hello";  
// 明确指定长度,需要包含结尾的空字符
char charArray2[10] = {'H', 'e', 'l', 'l', 'o', '\0'};  

访问和修改

可以通过索引访问和修改字符数组中的元素:

char charArray[] = "Hello";
charArray[0] = 'h';  // 修改第一个字符 hello

获取字符串长度

#include <cstring>

char str[] = "Hello";
std::size_t len = std::strlen(str);  // 获取字符串长度,不包括 '\0'

注意事项
缓冲区溢出:字符数组在使用时必须注意数组边界,避免缓冲区溢出。

空字符结尾:字符数组表示的字符串必须以 ‘\0’ 结尾,否则很多字符串操作函数会出现未定义行为。

动态分配:如果需要动态改变字符数组的大小,可以使用动态内存分配(例如 new 和 delete 或者 malloc 和
free),但这需要手动管理内存。

#include <iostream>
#include <cstring>

int main() {
    char* dynamicArray = new char[100];  // 动态分配内存
    std::strcpy(dynamicArray, "Hello, Dynamic World!");
    std::cout << dynamicArray << std::endl;
    delete[] dynamicArray;  // 释放内存
    return 0;
}

二、字符串(String)

C++标准库提供了std::string类,它是一个动态数组,可以自动调整大小以容纳不同长度的字符串。使用字符串时需要包含头文件。

#include <string>
// ...
std::string str = "Hello";

声明和初始化

std::string str1;  // 初始化为空字符串
std::string str2 = "Hello";  // 使用字符串字面值初始化

访问和修改

可以通过下标访问和修改字符串中的字符:

std::string str = "Hello";
char firstChar = str[0];  // 访问第一个字符
str[0] = 'h';  // 修改第一个字符

std::string str1 = "Hello, ";
std::string str2 = "World!";
std::string result = str1 + str2;  // 字符串连接

获取长度

std::string str = "Hello";
std::size_t len = str.length();  // 获取字符串长度

常使用的字符串方式

string

string是一个C++标准库中的一个类,。它包含了对字符串的各种常用操作(函数操作length() – 返回字符串的长度、find() – 在字符串中查找字符串、append() – 在字符串的末尾添加字符等等)

char[]

如上,指的是字符数组

char*

char* 是指向字符串的指针(它是指向字符串的首个字母),你可以让它指向一串常量字符串。

const char*

指针指向的是一个const char类型,即不能通过当前的指针对字符串的内容作出修改。

写到这里,就不得不提一下,面试时候的经典问题了

1.char*和 char[]的区别

内存位置和管理:
char* 可以指向堆上或静态区的内存,需要手动管理。char[] 在栈上分配内存,自动管理;

char* str1 = "Hello";            // 指向字符串字面值
char* str2 = new char[6];        // 动态分配内存,释放时需要手动清理
strcpy(str2, "Hello");           // 复制字符串
delete[] str2;

char str3[] = "Hello";           // 字符数组,大小为 6 包括终止符 '\0',并在栈上分配内存。

修改性:
字符串字面值通过 char* 指向时是不可修改的,如果指向动态分配的内存或非常量数据,可以修改内容。而 char[] 可以修改其内容。

char* str = "Hello";             // 字符串字面值,不可修改
// str[0] = 'h';                // 未定义行为

char dynamicStr[6];
strcpy(dynamicStr, "Hello");
dynamicStr[0] = 'h';             // 可修改

大小获取:
char[] 可以通过 sizeof 获取数组大小(包括终止符),而 char* 只能获取指针大小,无法通过 sizeof 获取字符串长度。

char str3[] = "Hello";
std::cout << sizeof(str3) << std::endl;  // 输出数组大小(例如 6,包括 '\0')
std::cout << strlen(str3) << std::endl;  // 输出字符串长度(例如 5)

char* str = "Hello";
std::cout << sizeof(str) << std::endl;   // 输出指针大小(64位 例如 8)
std::cout << strlen(str) << std::endl;   // 输出字符串长度(例如 5)

2. const char* 和 char* const的区别(就近原则)

平时很容易忘记,基于现在的表达,就近原则,以const最近的,那个就不能给修改

const char* 是指向常量字符的指针,也就是说,指针所指向的字符是不可变的。指针本身是可以修改的。 const 和char近,因此常量修饰的char,内容不能变,指针可以变。

const char* str = "Hello";  // 指向常量字符的指针
str = "World";  // 合法,修改指针指向的地址
str[0] = 'h';   // 非法,尝试修改指针指向的字符内容

char* const 是一个指向字符的常量指针,也就是说,指针本身是不可变的,但是它所指向的字符内容可以被修改。const 和 * 近,因此常量修饰指针,内容可以变,指针(指向)不能变。

char greeting[] = "Hello";
char* const ptr = greeting;  // 常量指针,指向字符的指针是不可变的
// ptr = someOtherAddress;  // 非法,尝试修改指针本身的地址
ptr[0] = 'h';               // 合法,修改指针指向的字符内容

三、字符串与字符数组区别与比较

内存管理

字符数组需要手动管理内存,而字符串由std::string类自动管理内存,无需手动分配或释放内存。

功能和操作

字符串类(std::string)提供了许多便利的方法来操纵字符串,如查找、连接、子串提取等,而字符数组则需要手动实现这些功能。

安全性

字符串类会自动处理空字符的添加和删除,因此更安全,避免了缓冲区溢出的问题。

长度

使用字符串类可以方便获取字符串的长度,而字符数组需要手动计算。

总之,字符数组在处理简单的文本数据时非常有效,但对于更复杂的字符串操作和管理,建议使用 std::string 类。使用字符串类std::string通常更方便、更安全,并且提供了更多的功能。在新的C++代码中,推荐使用std::string来代替传统的字符数组。

  • 44
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碧 波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值