字符数组VS字符串(一文搞懂有什么区别)

当你在C++的程序中,经常会遇到两种字符串的表达方法,一种是以字符数组的方式,还有用string的,这二者到底有什么不同?下文将会帮彻底弄懂。

因为许多函数参数当需要传入字符串的时候,有的代码中使用指向字符数组的指针来传递字符串,其实C++中传入字符数组,就相当于传入一个指向该数组的指针。具体原因将会在我的其他博客里面介绍,因此搞懂字符数组和C++中的string是很有必要的。

C语言中的字符串和C++中的字符串在本质上有很大的不同。

一、C语言中的字符串

  1. 表示方式:
    *C语言中的字符串是用字符数组表示的,并以空字符(‘\0’)结尾来标识字符串的结束。
  2. 定义和初始化:
char str1[] = "Hello, C!";
char str2[20] = "Hello, C!";
char str3[20];
strcpy(str3, "Hello, C!");
  1. 字符串操作
    C语言中,操作字符串需要使用标准库中的函数,如strlen、strcpy、strcat、strcmp等。
#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "Hello";
    char str2[] = ", World!";
    strcat(str1, str2); // 拼接字符串
    printf("%s\n", str1); // 输出:Hello, World!
    
    int len = strlen(str1); // 计算字符串长度
    printf("Length: %d\n", len); // 输出:12
    
    return 0;
}
  1. 内存管理
    需要手动管理内存。若使用动态分配,需自己负责释放内存,防止内存泄漏。
char *str = (char *)malloc(20 * sizeof(char));
strcpy(str, "Hello, C!");
// 使用完后要释放内存
free(str);

二、C++中的字符串

  1. 表示方式:
    C++中引入了std::string类,提供了更高层次的字符串操作。
  2. 定义和初始化:
#include <iostream>
#include <string>

int main() {
    std::string cppStr1 = "Hello, C++!";
    std::string cppStr2("Hello, C++!");
    std::string cppStr3;
    cppStr3 = "Hello, C++!";
    
    std::cout << cppStr1 << std::endl;
    return 0;
}
  1. 字符串操作:
    std::string类提供了丰富的成员函数,简化了字符串操作,如length、substr、find、replace等。
#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello";
    std::string str2 = ", World!";
    str1 += str2; // 拼接字符串
    std::cout << str1 << std::endl; // 输出:Hello, World!
    
    size_t len = str1.length(); // 计算字符串长度
    std::cout << "Length: " << len << std::endl; // 输出:12
    
    std::string subStr = str1.substr(0, 5); // 获取子串
    std::cout << "Substring: " << subStr << std::endl; // 输出:Hello
    
    return 0;
}
  1. 内存管理:
    std::string类自动管理内存,无需手动释放,防止了内存泄漏的问题。
  2. 功能和安全性:
    std::string类具有异常处理机制,当操作越界或内存不足时,可以抛出异常,增强了代码的健壮性。更加方便和安全,减少了手动管理内存的错误风险。

三、总结

特性C语言C++
表示方式字符数组string类
结束符空字符’\0’不需要空字符
内存管理手动管理自动管理
操作函数标准库函数(如strcpy等)成员函数(如length等)
安全性容易出错更加安全
  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值