cpp实现字符串八股strcpy()、strlen()、strcat()、strcmp()
1. strcpy()
从strSrc
地址开始且含有\0
结束符的字符串复制到以strDest
开始的地址空间内,返回值的类型为char*
一个基本的实现
#include <iostream>
#include <cassert> // 引入 assert 头文件
char* strcpy(char* strDest, const char* strSrc){
assert(strDest != nullptr && strSrc != nullptr);
char* addr = strDest;
while (*strSrc != '\0'){
*strDest = *strSrc;
strDest++;
strSrc++;
}
*strDest = '\0'; // 添加结束符
return addr;
}
int main() {
const char* source = "Hello, World!";
char destination[50]; // 确保目标数组足够大
strcpy(destination, source); // 调用自定义的 strcpy
std::cout << "Source: " << source << std::endl;
std::cout << "Destination: " << destination << std::endl;
return 0;
}
运行结果
Source: Hello, World!
Destination: Hello, World!
精简实现
char* strcpy(char* strDest, const char* strSrc){
assert(strDest != nullptr && strSrc != nullptr);
char* addr = strDest;
while ((*strDest++ = *strSrc++) != '\0'); // 精简实现
return addr;
}
2. strlen()
计算给定字符的长度
一个基本实现
#include <iostream>
#include <cassert> // 引入 assert 头文件
int strlen(const char* str){
assert(str != nullptr);
const char* s = str;
while(*s){
s++;
}
return s - str;
}
int main() {
const char* testString = "Hello, World!";
size_t length = strlen(testString); // 调用自定义的 strlen
std::cout << "The length of the string \"" << testString << "\" is: " << length << std::endl;
return 0;
}
运行结果为:
The length of the string "Hello, World!" is: 13
3. strcat()
将strSrc
所指向的字符串添加到strDest
的结尾处
一个基本实现
#include <iostream>
#include <cassert> // 引入 assert 头文件
char* strcat(char* strDest, const char* strSrc){
assert(strDest != nullptr && strSrc != nullptr);
char* ret = strDest;
while (*strDest){ // 找到strDest的'\0'结尾符
strDest++;
}
while (*strSrc){
*strDest = *strSrc;
strDest++;
strSrc++;
}
*strDest = '\0'; // 添加结尾符
return ret;
}
int main() {
char destination[50] = "Hello, "; // 确保目标数组足够大
const char* source = "World!";
strcat(destination, source); // 调用自定义的 strcat
std::cout << "Concatenated string: " << destination << std::endl;
return 0;
}
运行结果
Concatenated string: Hello, World!
一个精简实现
char* strcat(char* strDest, const char* strSrc){
assert(strDest != nullptr && strSrc != nullptr);
char* ret = strDest;
while (*strDest){ // 找到strDest的'\0'结尾符
strDest++;
}
while ((*strDest++ = *strSrc++) != '\0');
return ret;
}
4. strcmp()
比较两个字符串str1
和str2
,
- 若
str1 == str2
,则返回零 - 若
str1 < str2
,则返回负数 - 若
str1>str2
,则返回正数
一个基本实现
#include <iostream>
#include <cassert> // 引入 assert 头文件
int strcmp(const char* str1, const char* str2){
assert(str1 != nullptr && str2 != nullptr);
// 找到首个不相等的字符
while (*str1 && *str2 && (*str1 == *str2)){
str1++;
str2++;
}
return *str1 - *str2;
}
int main() {
const char* str1 = "Hello";
const char* str2 = "Hello";
const char* str3 = "World";
std::cout << "Comparing \"" << str1 << "\" and \"" << str2 << "\": " << strcmp(str1, str2) << std::endl; // 结果应为 0
std::cout << "Comparing \"" << str1 << "\" and \"" << str3 << "\": " << strcmp(str1, str3) << std::endl; // 结果应为负值
return 0;
}
运行结果
Comparing "Hello" and "Hello": 0
Comparing "Hello" and "World": -15