C++学习系列(5):C++字符串和结构体
1. 前言
在前面的文章中,我们学习了 数组和指针,本篇博客将重点讲解 C++字符串和结构体。
在 C++ 语言中,字符串和结构体是非常重要的概念:
- 字符串(String):用于存储和操作文本数据。
- 结构体(Struct):用于定义自定义数据类型,类似于 Python 的字典或 Java 的类。
掌握这两部分内容,将有助于更高效地处理文本数据和组织数据结构。
2. C++字符串(String)
2.1 C 风格字符串(char 数组)
在 C 语言中,字符串是字符数组,以 '\0'
结尾:
#include <iostream>
int main() {
char str[] = "Hello, C++!";
std::cout << "字符串内容: " << str << std::endl;
return 0;
}
📌 特点
- 字符串本质上是 char 数组。
- 末尾有
'\0'
(空字符),表示字符串的结束。
2.2 字符串输入
cin
读取字符串:
#include <iostream>
int main() {
char name[50];
std::cout << "请输入你的名字: ";
std::cin >> name; // 读取字符串(遇到空格会停止)
std::cout << "你好, " << name << "!" << std::endl;
return 0;
}
📌 cin 读取字符串的限制
- 遇到 空格、换行符 时,输入会结束。
cin.getline()
可以读取包含空格的字符串:
std::cin.getline(name, 50);
2.3 string
类(推荐使用)
C++ 提供 string
类(在 <string>
头文件中):
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
std::cout << "字符串: " << str << std::endl;
return 0;
}
📌 string 类的优势
- 不需要手动管理
'\0'
结尾。 - 提供字符串拼接、查找、替换等功能。
2.4 string
的常用操作
#include <iostream>
#include <string>
int main() {
std::string s1 = "Hello";
std::string s2 = " C++";
std::string s3 = s1 + s2; // 拼接字符串
std::cout << "拼接后: " << s3 << std::endl;
std::cout << "字符串长度: " << s3.length() << std::endl;
std::cout << "是否为空: " << s3.empty() << std::endl;
std::cout << "查找 'C++': " << s3.find("C++") << std::endl;
return 0;
}
📌 常用方法
.length()
获取字符串长度.empty()
检查是否为空.find("子串")
查找子串位置.substr(start, len)
截取子串.append("str")
追加字符串
3. C++结构体(Struct)
3.1 结构体的定义
结构体是一种 自定义数据类型,用于存储多个不同类型的数据:
#include <iostream>
struct Student {
std::string name;
int age;
float score;
};
int main() {
Student stu1 = {"张三", 20, 85.5};
std::cout << "姓名: " << stu1.name << ", 年龄: " << stu1.age << ", 分数: " << stu1.score << std::endl;
return 0;
}
📌 结构体的作用
- 类似于 Java 的类(但没有方法)。
- 用于组织复杂的数据结构(例如存储多个字段)。
3.2 结构体数组
#include <iostream>
struct Student {
std::string name;
int age;
};
int main() {
Student students[2] = {{"张三", 20}, {"李四", 22}};
for (int i = 0; i < 2; i++) {
std::cout << "姓名: " << students[i].name << ", 年龄: " << students[i].age << std::endl;
}
return 0;
}
📌 结构体数组
- 结构体可以存储多个对象的数据。
- 使用 数组 统一管理。
3.3 结构体指针
指针可以指向结构体:
#include <iostream>
struct Student {
std::string name;
int age;
};
int main() {
Student stu = {"王五", 21};
Student* p = &stu; // 指针指向结构体
std::cout << "姓名: " << p->name << ", 年龄: " << p->age << std::endl;
return 0;
}
📌 结构体指针
p->name
等价于(*p).name
- 适用于动态分配内存的结构体。
3.4 结构体嵌套
结构体可以包含另一个结构体:
#include <iostream>
struct Address {
std::string city;
std::string street;
};
struct Student {
std::string name;
int age;
Address addr; // 嵌套结构体
};
int main() {
Student stu = {"赵六", 23, {"北京", "长安街"}};
std::cout << "姓名: " << stu.name << ", 城市: " << stu.addr.city << std::endl;
return 0;
}
📌 结构体嵌套
- 允许更复杂的数据组织。
4. 结构体与 new
动态分配
结构体可以使用 new
进行动态分配:
#include <iostream>
struct Student {
std::string name;
int age;
};
int main() {
Student* p = new Student{"张三", 20};
std::cout << "姓名: " << p->name << ", 年龄: " << p->age << std::endl;
delete p; // 释放内存
return 0;
}
📌 动态分配
new Student{"张三", 20}
分配结构体内存delete p
释放内存,防止内存泄漏
5. 小结与展望
在本篇博客中,我们学习了:
✅ C 风格字符串(char 数组)
✅ C++ string
类及其操作
✅ 结构体的定义、结构体数组、指针和嵌套
✅ 结构体的动态分配
🎯 字符串和结构体是 C++ 编程的重要组成部分,在文件处理、数据库操作等场景中广泛使用。
在下一篇 C++学习系列(6) 中,我们将深入学习 C++面向对象编程(OOP),敬请期待!🚀
💡 如果你喜欢这篇文章,欢迎点赞、收藏,并关注本系列!