一、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() 方法等)等一系列方便的成员函数,使得对字符串的操作更加便捷和安全。
- 如何在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; }