cpp实现字符串八股strcpy()、strlen()、strcat()、strcmp()

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()

比较两个字符串str1str2

  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值