- 机器人等级考试
C++ C风格字符串学习笔记
- 2025-7-27 13:39:32 @
以下是 C++ C风格字符串学习笔记教程,包含基础概念、常用操作、示例代码和详细注释:
C++ C风格字符串学习笔记
一、C风格字符串的本质
C风格字符串实际上是字符数组,以空字符 '\0'
结尾。
例如:"Hello"
存储为 {'H', 'e', 'l', 'l', 'o', '\0'}
。
二、字符串的定义与初始化
-
字符数组方式
char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 显式添加 '\0' char str2[] = "Hello"; // 自动添加 '\0',数组长度为6
-
指针方式
const char* str3 = "World"; // 指向字符串常量(只读)
注意:
- 字符数组可修改内容,指针指向的字符串常量不可修改。
- 字符串长度 = 字符数 + 1(包含
'\0'
)。
三、字符串输入输出
-
输出
cout << str2; // 输出: Hello
-
输入
char name[20]; cin >> name; // 遇到空格或换行停止 cin.getline(name, 20); // 读取整行(包含空格)
四、常用字符串处理函数
需包含头文件 <cstring>
。
-
计算字符串长度
strlen(str); // 返回字符串长度(不包含 '\0')
-
字符串复制
char dest[10]; strcpy(dest, "Copy"); // 复制内容到 dest strncpy(dest, "LongString", 5); // 复制前5个字符,需手动补 '\0'
-
字符串拼接
char src[20] = "Hello"; strcat(src, " World"); // 拼接后 src 为 "Hello World" strncat(src, "!", 1); // 拼接1个字符
-
字符串比较
strcmp("A", "B"); // 返回负数(-1) strcmp("A", "A"); // 返回0 strcmp("B", "A"); // 返回正数(1)
-
字符串查找
char* pos = strstr("Hello", "ll"); // 返回 "ll" 的首地址
五、示例代码:字符串操作演示
#include <iostream>
#include <cstring> // 包含C风格字符串函数库
using namespace std;
int main() {
// 1. 定义与初始化
char str1[20] = "Hello";
const char* str2 = "World";
// 2. 计算长度
cout << "Length of str1: " << strlen(str1) << endl; // 输出: 5
// 3. 字符串复制
char copy[20];
strcpy(copy, str1);
cout << "Copied: " << copy << endl; // 输出: Hello
// 4. 字符串拼接
strcat(copy, " ");
strcat(copy, str2);
cout << "Concatenated: " << copy << endl; // 输出: Hello World
// 5. 字符串比较
if (strcmp(str1, "Hello") == 0) {
cout << "str1 equals 'Hello'" << endl;
}
// 6. 字符串查找
char* pos = strstr(copy, "World");
if (pos != nullptr) {
cout << "Found 'World' at position: " << pos - copy << endl; // 输出: 6
}
return 0;
}
六、注意事项
-
内存溢出风险
char small[3]; strcpy(small, "LongString"); // 危险!会导致内存溢出
解决方法:使用
strncpy
并手动补'\0'
。 -
字符串常量不可修改
const char* msg = "Error"; msg[0] = 'W'; // 错误!常量不可修改
-
输入长度限制
char input[10]; cin.getline(input, 10); // 最多读取9个字符,留一个位置给 '\0'
七、总结
C风格字符串是C++的基础功能,适合性能敏感场景。但需注意手动管理内存和空字符。
后续可学习 std::string
类(C++标准库),它更安全、易用,支持自动内存管理。
希望这份教程能帮助你掌握C风格字符串!如果有疑问,欢迎随时提问~ 😊
1 条评论
-
admin SU @ 2025-7-27 13:40:33
以下是为你生成的 C风格字符串相关成员函数 学习笔记教程,包含基础概念、常用函数、示例代码和详细注释:
C++ C风格字符串成员函数学习笔记
一、C风格字符串概述
C风格字符串是以空字符
'\0'
结尾的字符数组,在<cstring>
头文件中提供了一系列处理函数。
例如:"Hello"
实际存储为{'H', 'e', 'l', 'l', 'o', '\0'}
。二、常用字符串处理函数
以下函数均需包含头文件
<cstring>
。1. 字符串长度计算
size_t strlen(const char* str);
- 功能:返回字符串长度(不包含
'\0'
)。 - 示例:
const char* str = "Hello"; cout << strlen(str); // 输出: 5
2. 字符串复制
char* strcpy(char* dest, const char* src); char* strncpy(char* dest, const char* src, size_t n);
- 功能:
strcpy
:复制整个字符串。strncpy
:复制最多n
个字符,需手动补'\0'
。
- 示例:
char dest[10]; strcpy(dest, "Hello"); // dest = "Hello" strncpy(dest, "ABC", 2); // dest = "AB"(未补 '\0',可能导致问题) dest[2] = '\0'; // 手动补 '\0'
3. 字符串拼接
char* strcat(char* dest, const char* src); char* strncat(char* dest, const char* src, size_t n);
- 功能:
strcat
:将src
拼接到dest
末尾。strncat
:拼接最多n
个字符,自动补'\0'
。
- 示例:
char dest[20] = "Hello"; strcat(dest, " World"); // dest = "Hello World" strncat(dest, "!", 1); // dest = "Hello World!"
4. 字符串比较
int strcmp(const char* s1, const char* s2); int strncmp(const char* s1, const char* s2, size_t n);
- 功能:
- 按字典序比较字符串,返回值:
< 0
:s1 < s2
0
:s1 == s2
> 0
:s1 > s2
strncmp
只比较前n
个字符。
- 按字典序比较字符串,返回值:
- 示例:
strcmp("A", "B"); // 返回 -1 strcmp("A", "A"); // 返回 0 strncmp("ABC", "ABD", 2); // 返回 0(前2个字符相同)
5. 字符串查找
char* strstr(const char* haystack, const char* needle); char* strchr(const char* str, int c);
- 功能:
strstr
:查找子串needle
,返回首次出现的位置指针。strchr
:查找字符c
,返回首次出现的位置指针。
- 示例:
const char* text = "Hello World"; char* pos = strstr(text, "World"); // pos 指向 "World" 的首地址 char* p = strchr(text, 'o'); // p 指向第一个 'o'
6. 字符串分割
char* strtok(char* str, const char* delimiters);
- 功能:将字符串按分隔符
delimiters
分割为多个token。 - 示例:
char str[] = "Hello,World,C++"; char* token = strtok(str, ","); // token = "Hello" while (token != nullptr) { cout << token << endl; token = strtok(nullptr, ","); // 继续分割剩余部分 } // 输出: // Hello // World // C++
三、示例代码:综合演示
#include <iostream> #include <cstring> // 包含C风格字符串函数库 using namespace std; int main() { // 1. 字符串长度 const char* str = "Hello"; cout << "Length: " << strlen(str) << endl; // 输出: 5 // 2. 字符串复制与拼接 char dest[20]; strcpy(dest, "Hello"); strcat(dest, " "); strncat(dest, "World", 3); // 拼接 "Wor" cout << "Dest: " << dest << endl; // 输出: Hello Wor // 3. 字符串比较 if (strcmp(dest, "Hello Wor") == 0) { cout << "Strings are equal." << endl; } // 4. 字符串查找 char* pos = strstr(dest, "Wor"); if (pos != nullptr) { cout << "Found at position: " << (pos - dest) << endl; // 输出: 6 } // 5. 字符串分割 char text[] = "apple,banana,orange"; char* token = strtok(text, ","); while (token != nullptr) { cout << "Token: " << token << endl; token = strtok(nullptr, ","); } // 输出: // Token: apple // Token: banana // Token: orange return 0; }
四、注意事项
-
内存安全
- 使用
strncpy
和strncat
避免缓冲区溢出。 - 确保目标数组足够大,能容纳所有字符(包括
'\0'
)。
- 使用
-
字符串常量不可修改
const char* str = "Hello"; str[0] = 'J'; // 错误!常量不可修改
-
strtok
的副作用strtok
会修改原字符串(用'\0'
替换分隔符)。- 线程不安全,如需多线程使用,可考虑
strtok_r
。
五、总结
C风格字符串函数虽然灵活,但需手动管理内存和空字符,容易出错。
建议在实际开发中优先使用 C++ 的std::string
类,它更安全、易用,支持自动内存管理。希望这份教程能帮助你掌握C风格字符串函数!如有疑问,欢迎提问~ 😊
- 功能:返回字符串长度(不包含
- 1