C++:字符串操作函数
strcpy()
功能:把一个字符串复制到另一个字符串。
#include <iostream>
#include <cstring>
using namespace std;int main() {char src[] = "Hello";char dest[10];strcpy(dest, src);cout << "Copied string: " << dest << endl; // 输出: Copied string: Helloreturn 0;
}
原理:该函数会逐个字符地把源字符串(包含\0结束符)复制到目标字符串。
使用场景:当你需要复制字符串内容时可以使用,不过要留意目标字符串的空间得足够大。
实现方法:
char* my_strcpy(char* dest, const char* src) {char* originalDest = dest;while (*src != '\0') {*dest = *src;dest++;src++;}*dest = '\0'; // 添上终止符return originalDest;
}
strlen()
功能:计算字符串的长度(不包含结束符\0)。
#include <iostream>
#include <cstring>
using namespace std;int main() {char str[] = "Hello";size_t len = strlen(str);cout << "Length: " << len << endl; // 输出: Length: 5return 0;
}
原理:此函数从字符串起始位置开始计数,直到遇到\0结束符。
使用场景:在处理动态分配的字符串或者需要知晓字符串长度时会用到。
实现方法:
size_t my_strlen(const char* str) {const char* ptr = str;while (*ptr != '\0') {ptr++;}return ptr - str;
}
strcat()
功能:将一个字符串连接到另一个字符串的末尾。
#include <iostream>
#include <cstring>
using namespace std;int main() {char dest[20] = "Hello";char src[] = " World";strcat(dest, src);cout << "Concatenated: " << dest << endl; // 输出: Concatenated: Hello Worldreturn 0;
}
原理:该函数会找到目标字符串的\0结束符,然后把源字符串(包含\0)复制到这个位置。
使用场景:适用于拼接多个字符串的情况,但要保证目标字符串有足够的空间。
实现方法:
char* my_strcat(char* dest, const char* src) {char* originalDest = dest;// 先找到dest的末尾while (*dest != '\0') {dest++;}// 接着进行字符串的复制while (*src != '\0') {*dest = *src;dest++;src++;}*dest = '\0'; // 添上终止符return originalDest;
}
strcmp()
功能:对两个字符串进行比较。
#include <iostream>
#include <cstring>
using namespace std;int main() {char str1[] = "apple";char str2[] = "apple";char str3[] = "banana";cout << strcmp(str1, str2) << endl; // 输出: 0(相等)cout << strcmp(str1, str3) << endl; // 输出: 负值("apple" < "banana")cout << strcmp(str3, str1) << endl; // 输出: 正值("banana" > "apple")return 0;
}
原理:该函数会按字典序逐个比较字符的 ASCII 值,直到发现不同或者遇到\0。
使用场景:常用于字符串的排序或者查找操作。
实现方法:
int my_strcmp(const char* s1, const char* s2) {while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {s1++;s2++;}return (int)(*s1) - (int)(*s2);
}
std::string类中的length()和size()
这两个方法在功能上完全一样,都是返回字符串的字符个数,而且时间复杂度为 O (1)。
#include <iostream>
#include <string>
using namespace std;int main() {string str = "Hello";cout << str.length() << endl; // 输出: 5cout << str.size() << endl; // 输出: 5return 0;
}
返回的长度不包含字符串结束符\0。
对于std::string来说,这两个方法是等价的,只是为了保持接口的一致性才提供了两种写法。
实现方法:
// std::string类中length()和size()的实现(原理)
// 由于std::string是类,下面展示的是其成员函数的实现原理
class MyString {
private:char* data;size_t len;
public:size_t length() const { return len; }size_t size() const { return len; }// 其他成员函数
};// 容器类中size()的实现(以vector为例)
// 下面展示的是vector成员函数的实现原理
template<typename T>
class MyVector {
private:T* data;size_t count;
public:size_t size() const { return count; }// 其他成员函数
};
容器类(像vector、list等)中的size()
size()是标准容器的通用方法,用于返回容器中元素的数量。
#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> nums = {1, 2, 3, 4, 5};cout << nums.size() << endl; // 输出: 5return 0;
}