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;
}