Skip to content

Commit 2fd4d7e

Browse files
committed
cpp_Basic
1 parent c0dad14 commit 2fd4d7e

3 files changed

Lines changed: 220 additions & 0 deletions

File tree

docs/CS/data_structure/data_structure.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,31 @@ typedef struct {
222222
!!!做题
223223
224224
## ch4.串
225+
串:字符串,子串:多个连续字符组成的子序列,
226+
227+
串的存储结构:
228+
````
229+
线性表版
230+
#define MAXLEN 255
231+
typedef struct{
232+
char ch[MAXLEN];
233+
int length;
234+
}SString;
235+
236+
或者
237+
238+
堆分配版
239+
typedef struct{
240+
char *ch;
241+
int length;
242+
}HString;
243+
244+
````
245+
246+
247+
248+
249+
225250
226251
227252
## ch5.树与二叉树

docs/Tech/cpp_Basic.md

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# C++语法基础
2+
3+
## C/C++字符串基础
4+
5+
!!! abstract "概述"
6+
本节涵盖C/C++字符串的基础知识,包括指针操作、格式化输出、字符串定义和常用操作函数。
7+
8+
### printf格式化输出
9+
10+
!!! info "printf格式说明符"
11+
printf函数支持多种格式说明符,用于输出不同类型的数据。
12+
13+
```c
14+
#include <cstdio>
15+
16+
int main() {
17+
int num = 123;
18+
float f = 3.1415926;
19+
char ch = 'A';
20+
const char* str = "Hello, World!";
21+
22+
printf("Number: %d\n", num); // 整数
23+
printf("Float: %.2f\n", f); // 浮点数(保留2位小数)
24+
printf("Hex: %x\n", num); // 十六进制
25+
printf("Character: %c\n", ch); // 字符
26+
printf("String: %s\n", str); // 字符串
27+
printf("Pointer: %p\n", &num); // 指针地址
28+
29+
return 0;
30+
}
31+
```
32+
33+
### 转义字符总结
34+
35+
!!! tip "常用转义字符"
36+
转义字符用反斜杠(\)开头,表示特殊字符或控制字符。
37+
38+
| 转义字符 | 含义 |
39+
|---------|------|
40+
| `\n` | 换行符 |
41+
| `\t` | 制表符 |
42+
| `\\` | 反斜杠 |
43+
| `\"` | 双引号 |
44+
| `\0` | 字符串结束符 |
45+
| `\r` | 回车符 |
46+
47+
### 字符串定义
48+
49+
!!! warning "字符串定义注意事项"
50+
不同的字符串定义方式有不同的内存分配和修改权限。
51+
52+
#### 基本定义方式
53+
54+
```c++
55+
// 字符串字面量(只读)
56+
const char* str0 = "Hello, World!";
57+
58+
// 可修改的字符串数组
59+
char str2[] = "Hello, World!";
60+
61+
// 预分配空间
62+
char str3[20];
63+
str3[0] = 'H';
64+
str3[1] = 'i';
65+
str3[2] = '\0'; // 必须手动添加结束符
66+
```
67+
68+
!!! danger "废弃用法"
69+
`char* str = "Hello, World!";` 在C++11中已被废弃,会产生编译警告。
70+
71+
#### 字符串输入方法
72+
73+
!!! info "多种输入方式"
74+
根据需要选择合适的字符串输入方法。
75+
76+
```c++
77+
// 1. scanf - 读取单词(遇空格停止)
78+
char str5[20];
79+
scanf("%19s", str5); // 限制长度防止溢出
80+
81+
// 2. fgets - 读取整行(C风格)
82+
char str6[100];
83+
while (fgets(str6, sizeof(str6), stdin)) {
84+
printf("%s", str6);
85+
}
86+
87+
// 3. getline - 读取整行(C++风格)
88+
#include <iostream>
89+
#include <string>
90+
string line;
91+
while (getline(cin, line)) {
92+
cout << line << endl;
93+
}
94+
```
95+
96+
!!! tip "格式化字符集"
97+
scanf支持特殊格式化选项:
98+
99+
- `%[a-z]`:读取小写字母
100+
- `%[^...]`:读取不包含特定字符的字符串
101+
- `%[...]`:读取包含特定字符的字符串
102+
103+
### 字符串操作函数
104+
105+
!!! note "头文件"
106+
使用这些函数需要包含 `#include <cstring>` 或 `#include <string.h>`
107+
108+
#### 基本操作
109+
110+
```c++
111+
char* src = "Hello, World!";
112+
char dest[50];
113+
114+
// 长度计算
115+
int len = strlen(src);
116+
117+
// 字符串复制
118+
strcpy(dest, src); // 完整复制
119+
strncpy(dest, src, 5); // 复制前5个字符
120+
121+
// 字符串连接
122+
strcat(dest, "!!!"); // 连接字符串
123+
strncat(dest, "!!!", 3); // 连接前3个字符
124+
125+
// 字符串比较
126+
int cmp = strcmp(src, dest); // 完整比较
127+
int ncmp = strncmp(src, dest, 5); // 比较前5个字符
128+
```
129+
130+
#### 高级操作
131+
132+
!!! example "字符集检查 - strspn"
133+
检查字符串前缀是否由指定字符集组成。
134+
135+
```c++
136+
char str[] = "129th";
137+
char accept[] = "1234567890";
138+
int i = strspn(str, accept);
139+
printf("str 前 %d 个字符都属于数字\n", i); // 输出:3
140+
```
141+
142+
!!! example "子字符串查找 - strstr"
143+
在字符串中查找子字符串的位置。
144+
145+
```c++
146+
char haystack[] = "Hello, World!";
147+
char needle[] = "World";
148+
char* pos = strstr(haystack, needle);
149+
150+
if (pos != NULL) {
151+
printf("找到子字符串,位置: %ld\n", pos - haystack);
152+
printf("子字符串内容: %s\n", pos);
153+
} else {
154+
printf("未找到子字符串\n");
155+
}
156+
```
157+
158+
!!! example "字符串分割 - strtok"
159+
按指定分隔符分割字符串。
160+
161+
```c++
162+
char str[] = "Hello, World! This is C++.";
163+
const char* delim = " ,.!"; // 多个分隔符
164+
165+
char* token = strtok(str, delim);
166+
while (token != NULL) {
167+
printf("%s\n", token);
168+
token = strtok(NULL, delim); // 后续调用传入NULL
169+
}
170+
```
171+
172+
!!! warning "strtok注意事项"
173+
strtok会修改原字符串,将分隔符替换为'\0'。如果需要保持原字符串不变,请先复制一份。
174+
175+
#### 类型转换
176+
177+
!!! example "字符串转数字 - atoi系列"
178+
将字符串转换为数值类型。
179+
180+
```c++
181+
#include <cstdlib>
182+
183+
char str[100];
184+
fgets(str, sizeof(str), stdin);
185+
186+
int num = atoi(str); // 转换为整数
187+
long lnum = atol(str); // 转换为长整数
188+
double dnum = atof(str); // 转换为浮点数
189+
190+
printf("字符串 %s 转换为整数: %d\n", str, num);
191+
```
192+
193+
!!! tip "更安全的转换"
194+
考虑使用 `strtol`、`strtod` 等函数,它们提供更好的错误检查机制。

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ nav:
6262
- 力扣记录: Tech/leetcode_record.md
6363
- record: Tech/record.md
6464
- STL容器: Tech/stl_cheatsheet.md
65+
- C++基础: Tech/cpp_basic.md
6566

6667
- 生活:
6768
- 生活导航: Life/index.md

0 commit comments

Comments
 (0)