结构体实现的字符串与常规存储的区别?非结构体非string的存储方法
嘿,我太懂你这种困惑了!当年刚接触C++的时候,看到老师写这种封装char数组的结构体,还以为是啥高级操作,结果自己用的时候被泼冷水——完全懂你那种“我觉得有用为啥老师说没必要”的心情😂
先给你拆解老师说“没必要”的原因:你看到的那个string_结构体,只是单纯把一个char[255]包了一层,既没加字符串拼接、比较、长度计算这些实用的成员方法,也没优化内存管理,说白了就是多了一层无意义的封装,反而让代码变啰嗦。考试里用这种写法,确实不如直接用原生的char数组来得简洁规范。
那回到你的问题:不自定义结构体也不用std::string的话,怎么存储字符串?其实有两种最常用的方式:
1. 静态char数组(固定大小)
这是最直接的方式,直接用二维char数组替代你原来的结构体数组。比如你原来的person结构体可以改成这样:
#include <iostream> #include <cstring> // 要用到C风格字符串操作函数的话得加这个头文件 using namespace std; struct person { // 存储5个生日字符串,每个最多254个字符(留一个位置存结束符'\0') char birthday[5][255]; // 存储5个名字字符串,同理 char name[5][255]; } x; int main() { // 给第一个名字赋值 strcpy(x.name[0], "张三"); // 输出名字 cout << x.name[0] << endl; return 0; }
这种方式的好处是不用操心内存分配,数组大小固定,直接用就行;缺点是如果字符串长度超过数组上限会有溢出风险,所以要提前预估好最大长度。
2. 动态char指针(灵活分配内存)
如果不想固定数组大小,或者需要存储很长的字符串,可以用char*动态分配内存。写法大概是这样:
#include <iostream> #include <cstring> using namespace std; struct person { // 5个指向字符串的指针 char* birthday[5]; char* name[5]; } x; int main() { // 给第一个名字分配255字节的内存 x.name[0] = new char[255]; // 复制字符串进去 strcpy(x.name[0], "李四"); cout << x.name[0] << endl; // 用完一定要释放内存,不然会内存泄漏! delete[] x.name[0]; return 0; }
这种方式的好处是内存更灵活,需要多大就分配多大;但要注意必须手动释放内存,不然程序运行久了会占满内存。另外,如果你用C的字符串操作函数(比如strcpy、strcat、strcmp),记得要包含<cstring>头文件。
最后再唠两句
其实老师说的“没必要”,核心是那个自定义的string_结构体没有带来任何实际的便利——它既没简化操作,也没提升性能,反而让代码多了一层不必要的嵌套。直接用char数组(静态或动态),配合C标准库的字符串操作函数,完全能满足存储和操作字符串的需求,考试里这么写既简洁又符合基础语法规范~
内容的提问来源于stack exchange,提问作者prografail

