【C/C++】字符串的处理 ☞ “char str[]“ vs “std::string str“

'char str[]' 和 'std::string' 在 C++ 中都用于存储和操作字符串,但它们之间存在一些关键的差异。

结论写在前面:

尽管 char str[] 在某些情况下仍然有其用途,但现代 C++ 编程推荐使用 std::string,因为它提供了更好的安全性、灵活性和易用性。

注意点写在前面:

string只能用 cin 和 cout 处理,不能用 scanf 和 printf 处理


1 char str[]   (C风格字符串)

1.1 定义方式

  • 'char str[]'定义了一个字符数组

例如,char str[] = "hello"; 会在栈上创建一个包含字符串 "hello" 和一个终结符 '\0' 的字符数组。

1.2 存储

字符串存储在字符数组中,数组的大小在编译时确定,并且包括了一个额外的字符用于存储字符串的终结符 '\0',这意味着字符串是以 null 结尾的。

1.3 性能

对于固定大小且不经常改变的字符串,'char str[]' 可能会略微快一点,因为它避免了动态内存分配的开销

1.4操作限制

字符串的大小在初始化时固定,之后不能扩展或缩小(不包括直接操作内存的低级方法)。对字符串的操作通常需要手动实现或使用 C 语言的字符串处理函数(如 strcpy,strcat,strlen 等)。


2 'std::string'   (C++标准库字符串)

2.1 定义方式

  • 'std::string' 是 C++标准库中的一个类,用于表示可变长度的字符串

例如,std::string str = "hello"; 创建了一个 'std::string' 对象。

2.2 存储

  • 字符串的内容存储在动态分配的内存中。
  • 'std::string' 能够在运行时改变大小,无需担心手动管理内存。

2.3 性能

对于需要频繁修改或处理的字符串,'std::string' 提供了内部优化,如小字符串优化(SSO)等。虽然动态内存分配可能增加开销,但对于大多数应用来说,这种开销是可以接受的,并且由于其灵活性和安全性,通常是首选。

2.4 操作限制

'std::string' 支持丰富的操作,如添加、插入、删除、子字符串、查找等,而且这些操作都是类型安全的。标准库还提供了许多用于处理 'std::string' 的函数和方法。

用cin读入字符串的时候,以空格为分隔符;读入一整行的字符串,用getline

#include <iostream>
#include <cstring>

using std::cin;
using std::cout;
using std::endl;

int main()
{
    string s = "wolves ay we"; //赋值字符串
    string s1 = s;
    string s2 = s + s1;        //字符串拼接直接用+号
    string s3;
    string s4;
    
    cin >> s3; // 'string只能用 cin 和 cout 处理
    cout << s; // 不能用 scanf 和 printf 处理
    
    getline(cin, s4);    // 读取一行的字符串,包括空格

    cout << s4.length(); // str的长度可以用 s.length() 获取

    // substr 截取某个字符串中的子串
    string s1 = s.substr(3);    // 从下标3开始一直到结束
    string s2 = s.substr(5, 3); // 表示从下标5开始,3个字符


    return 0;
}

3 主要差异总结

  • 类型安全:'std::string' 提供了更好的类型安全性,减少了出错的机会。
  • 易用性:'std::string' 的接口设计更现代,使用更方便,隐藏了许多底层的细节,如动态内存管理。
  • 灵活性:'std::string' 在处理动态变化的字符串时更加灵活和强大。
  • 兼容性:'char str[]' 在与 C 语言代码交互时可能更加直接和方便。

总结,对于现代 C++ 编程,推荐使用 'std::string',因为它提供了更强大的功能,更好的安全性,以及更高的编码效率。在需要与 C 语言接口或旧的代码库交互时,或在极其受限的环境(如极小的嵌入式系统)中,使用 'char str[]' 仍然是合理的选择。

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值