首页 > 编程语言 >C和C++的字符串有什么不同?

C和C++的字符串有什么不同?

时间:2024-11-02 21:44:51浏览次数:7  
标签:存储 string 不同 str1 C++ char str2 字符串

一、C 语言中字符串的存储方式

C语言没有专门用于存储字符串的变量类型,字符串都被存储在 char 类型的数组中,且以字符 \0结尾;

字符数组存储

在 C 语言中,字符串常常以字符数组的形式进行存储。例如:

char str[] = "Hello";

这里定义了一个字符数组 str,编译器会自动在字符串常量 "Hello" 的末尾添加一个空字符 '\0',用来标识字符串的结束。所以实际上数组 str 所占用的内存空间是 6 个字节,依次存储 'H'、'e'、'l'、'l'、'o' 和 '\0'。

指针指向字符串常量存储

可以通过字符指针来指向一个字符串常量,比如:

char *ptr = "World";

此时,字符串常量 "World" 被存储在只读的内存区域(一般是程序的常量区),ptr 指针指向该字符串常量的首地址。需要注意的是,由于字符串常量所在区域是只读的,所以试图通过指针去修改字符串常量的内容会导致未定义行为。

二、C++ 语言中字符串的存储方式

兼容 C 风格存储

C++ 完全兼容 C 语言的字符串存储方式,也就是说,上述 C 语言中提到的字符数组存储字符串以及指针指向字符串常量的方式在 C++ 中同样可以正常使用。

string 类存储

C++ 引入了 std::string 类来专门处理字符串,这种方式提供了更方便、更安全的字符串处理机制。

动态内存管理:当创建一个 std::string 对象时,它会在内部根据需要动态地分配足够的内存来存储字符串内容。例如:
#include <string>
using namespace std;
string str = "Hello C++";

它会依据字符串 "Hello C++" 的长度(包含结尾的空字符)在堆上动态分配相应的内存来存储该字符串。

自动内存调整:与 C 语言中固定大小的字符数组不同,std::string 对象能够根据字符串的操作(如拼接、追加等)自动地调整所占用的内存大小。例如:
string str1 = "Hello";
str1 += " World";

在执行 str1 += " World" 操作时,str1 对象会自动重新分配足够的内存来容纳拼接后的新字符串 "Hello World",并且它会妥善处理好内存的释放和重新分配等相关操作,无需程序员手动去干预。

对象封装特性:

std::string 作为一个类,具备良好的封装性。它提供了诸如获取字符串长度(通过 length() 或 size() 方法)、访问单个字符(通过 [] 运算符等)、字符串比较(通过 compare() 方法等)等一系列方便的成员函数,使得对字符串的操作更加便捷和安全。

  1. 如何在C下比较两个字符串是否相同?
    #include<stdio.h>
    
    int cmp(const char* str1, const char* str2) {
        while (*str1 != '\0' && *str2 != '\0') {
            if (*str1 != *str2) return 0;//当不相等时,直接结束程序返回0
            str1++;
            str2++;
        }
        if (*str1 != 0 || *str2 != 0) return 0;//当两字符串其中一个有剩余时,直接结束程序返回0
        return 1;
    }
    int main() {
        char str1[] = "hello";
        char str2[] = "helloo";
        if (cmp(str1, str2) == 1) {
            printf("两个字符串相等");
    
        }
        else {
            printf("两个字符串不相等");
        }
        return 0;
    }
    

标签:存储,string,不同,str1,C++,char,str2,字符串
From: https://blog.csdn.net/2202_75941514/article/details/143457226

相关文章

  • 代码随想录算法训练营第十天|leetcode232.用栈实现队列、leetcode225. 用队列实现栈、
    1leetcode232.用栈实现队列题目链接:232.用栈实现队列-力扣(LeetCode)文章链接:代码随想录视频链接:栈的基本操作!|LeetCode:232.用栈实现队列哔哩哔哩bilibili自己的思路:真的第一次接触这个概念,完全没有任何思路,甚至不知道从何下手1.1基本概念栈就是相当于砌墙的砖头,先......
  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串、
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词哔哩哔哩bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作......
  • C++优选算法 分治-快排
    一、基本思想快速排序采用分治法策略,将一个大数组(或子数组)分为两个小数组,然后递归地对这两个小数组进行排序。其基本思想可以概括为“分解、解决、合并”三个步骤:分解:将原问题(即待排序的数组)分解为若干个规模较小、相互独立且与原问题形式相同的子问题(即子数组)。解决:若子问题......
  • C++ 手撕--共享式智能指针(shared_ptr)的简单实现
    C++手撕--共享式智能指针(shared_ptr)的简单实现共享式智能指针(shared_ptr):#include<iostream>#include<mutex>usingnamespacestd;template<typenameT>classShared_ptr{private:T*ptr;int*ref_count;std::mutex*mtx;voidrelease(){......
  • C++ 创建动态二维数组
    方法一:使用vector容器1.创建整数型二维数组先建列,再建行,先创建一个包含m个元素的向量a,再创建二维向量arr,通过push_back将一维向量作为行添加到二维向量中#include<iostream>#include<vector>usingnamespacestd;intmain(){ //创建一个包含m个元素,每个元素初始值为0......
  • 打卡信奥刷题(159)用C++工具信奥P1416[普及组/提高] 攻击火星
    攻击火星题目描述一群外星人将要攻击火星。火星的地图是一个nnn个点的无向图。这伙外星人将按照如下方法入侵,先攻击度为0......
  • 【C++动态规划】有效括号的嵌套深度
    本文涉及知识点C++动态规划LeetCode1111.有效括号的嵌套深度有效括号字符串定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度depth定义:即有效括号字符串嵌套的层数,depth(A)表示有效括号字符串A的嵌套深度。详......
  • 【GESP】C++一级练习BCQM3149,重复说话
    GESP一级知识点for循环语句和输出语句,非常简单。题目题解详见:https://www.coderli.com/gesp-1-bcqm3149/【GESP】C++一级练习BCQM3149,重复说话|OneCoderGESP一级知识点for循环语句和输出语句,非常简单。https://www.coderli.com/gesp-1-bcqm3149/C++GESP专项交流频道:GESP......
  • C++ 实现俄罗斯方块游戏
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • C和C++的字符串有什么不同?
    C字符串C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中,且以字符 \0结尾;#include<stdio.h>intmain(){ charstr[4]="sv";//charstr[3]="sv";是错的 charstr[]="sv"; charstr[4]={'s','','v'......