鱼C论坛

 找回密码
 立即注册
查看: 158|回复: 7

通过指针传参形式分别实现 mystrcat mystrcmp 以及mystrcpy函数

[复制链接]
发表于 2024-9-16 20:00:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
通过指针传参形式分别实现 mystrcat  mystrcmp 以及mystrcpy函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-16 20:01:02 | 显示全部楼层
好的,鱼油同学,以下是使用指针传参形式实现 `mystrcat`(字符串拼接)、`mystrcmp`(字符串比较)和 `mystrcpy`(字符串复制)的示例代码。

### 实现 `mystrcat`
#include <stdio.h>

// 拼接字符串
char *mystrcat(char *dest, const char *src) {
    char *p = dest;

    // 移动到dest的末尾
    while (*p != '\0') {
        p++;
    }

    // 逐个字符拼接src到dest尾部
    while (*src != '\0') {
        *p++ = *src++;
    }

    // 添加字符串结束符
    *p = '\0';

    return dest;
}

int main() {
    char dest[100] = "Hello, ";
    char src[] = "World!";
    mystrcat(dest, src);
    printf("%s\n", dest); // 输出:Hello, World!
    return 0;
}

### 实现 `mystrcmp`
#include <stdio.h>

// 比较两个字符串
int mystrcmp(const char *str1, const char *str2) {
    while (*str1 && (*str1 == *str2)) {
        str1++;
        str2++;
    }
    return *(unsigned char *)str1 - *(unsigned char *)str2;
}

int main() {
    char str1[] = "Hello";
    char str2[] = "Hello";
    int result = mystrcmp(str1, str2);
    printf("%d\n", result); // 输出:0 表示相等
    return 0;
}

### 实现 `mystrcpy`
#include <stdio.h>

// 复制字符串
char *mystrcpy(char *dest, const char *src) {
    char *p = dest;

    // 逐个字符复制
    while ((*p++ = *src++) != '\0');

    return dest;
}

int main() {
    char dest[100];
    char src[] = "Hello, World!";
    mystrcpy(dest, src);
    printf("%s\n", dest); // 输出:Hello, World!
    return 0;
}

希望这段代码能帮助你理解如何通过指针形式实现这些字符串操作函数。如果有任何问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-16 21:56:57 | 显示全部楼层
FishC 发表于 2024-9-16 20:01
好的,鱼油同学,以下是使用指针传参形式实现 `mystrcat`(字符串拼接)、`mystrcmp`(字符串比较)和 `mys ...

第二个实现mystrcmp看不太懂,具体讲解以下或者写的代码参次清晰点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 21:57:09 | 显示全部楼层
轻语远歌 发表于 2024-09-16 21:56
第二个实现mystrcmp看不太懂,具体讲解以下或者写的代 ...


好的,鱼油同学,我来详细解释 `mystrcmp` 的实现,并将代码组织得更清晰。

### 实现 `mystrcmp`

`mystrcmp` 函数用于比较两个字符串的大小。它的基本思路是一次比较两个字符串的每个字符,直到遇到不同的字符或到达字符串的结尾。
#include <stdio.h>

// 比较两个字符串
int mystrcmp(const char *str1, const char *str2) {
    // 循环比较两个字符串的字符
    while (*str1 && (*str1 == *str2)) {
        str1++;
        str2++;
    }
    // 最终返回差值
    return *(unsigned char *)str1 - *(unsigned char *)str2;
}

int main() {
    char str1[] = "Hello";
    char str2[] = "Hello";
    int result = mystrcmp(str1, str2);

    if (result < 0) {
        printf("str1 < str2\n");
    } else if (result > 0) {
        printf("str1 > str2\n");
    } else {
        printf("str1 == str2\n");
    }

    return 0;
}

### Explanation(解释)

1. **参数定义**:`const char *str1, const char *str2` 是两个指向待比较字符串的指针。
2. **循环比较**:
   - `while (*str1 && (*str1 == *str2))` 表示循环继续的条件是:当前字符不为 `\0` 且两个字符串的当前字符相同。
   - `str1++` 和 `str2++` 会将指针分别指向下一个字符。
3. **返回值**:
   - 当循环结束时,可能是因为某个字符不同,也可能是到达字符串的结尾。
   - `return *(unsigned char *)str1 - *(unsigned char *)str2;` 这行代码返回两个字符的差值,这个差值可以是:
     - 负值:`str1` 在字典顺序上小于 `str2`
     - 正值:`str1` 在字典顺序上大于 `str2`
     - 零值:`str1` 和 `str2` 相等

举个例子,如果 `str1` 是 "Hello" 而 `str2` 是 "Hello",函数会返回 `0`,表示它们是相等的。如果 `str1` 是 "Hello" 而 `str2` 是 "Hellp",函数会返回一个负值,因为 'o' < 'p'。

希望这个解释能帮助你理解 `mystrcmp` 函数。如果有任何进一步的问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 22:15:36 | 显示全部楼层
FishC 发表于 2024-9-16 20:01
好的,鱼油同学,以下是使用指针传参形式实现 `mystrcat`(字符串拼接)、`mystrcmp`(字符串比较)和 `mys ...

mystrcat实现字符串拼接,这个函数名的缩写字母,是怎么体现出拼接这个词的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 22:15:48 | 显示全部楼层
ultron110 发表于 2024-09-16 22:15
mystrcat实现字符串拼接,这个函数名的缩写字母,是怎 ...


fish油同学好,`mystrcat`中的`strcat`是`string concatenate`的缩写,其中 `str` 代表“字符串”(string),`cat` 代表“拼接”(concatenate)。下面我将完整的 `mystrcat` 实现再展示一下:

### 实现 `mystrcat`
#include <stdio.h>

// 拼接字符串
char *mystrcat(char *dest, const char *src) {
    char *p = dest;

    // 移动到 dest 的末尾
    while (*p != '\0') {
        p++;
    }

    // 逐个字符拼接 src 到 dest 尾部
    while (*src != '\0') {
        *p++ = *src++;
    }

    // 添加字符串结束符
    *p = '\0';

    return dest;
}

int main() {
    char dest[50] = "Hello, "; // 确保 dest 有足够的空间容纳拼接后的字符串
    char src[] = "World!";
    mystrcat(dest, src);
    printf("%s\n", dest); // 输出:Hello, World!
    return 0;
}

### 关键解释
- `mystrcat` 将 `src` 字符串拼接到 `dest` 字符串的尾部。
- `strcat` 是 `string concatenate` 的缩写,用于表示字符串拼接操作。

希望这个解释能让你更清楚为什么函数名叫 `mystrcat` 以及其实际功能。 如果还有其它问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-9-16 22:35:52 | 显示全部楼层
这3个函数不要写那么精简,最好都详细讲解以下代码思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-16 22:42:42 | 显示全部楼层
轻语远歌 发表于 2024-09-16 22:35
这3个函数不要写那么精简,最好都详细讲解以下代码思 ...


好的,鱼油同学。下面是 `mystrcat`、`mystrcmp` 和 `mystrcpy` 的详细实现及讲解。

### 1. 实现 `mystrcat`
`mystrcat` 函数用于将源字符串拼接到目标字符串的末尾。
#include <stdio.h>

// 字符串拼接函数
char *mystrcat(char *dest, const char *src) {
    // 找到目标字符串的末尾
    char *d = dest;
    while (*d != '\0') {
        d++;
    }

    // 将源字符串复制到目标字符串的末尾
    while (*src != '\0') {
        *d = *src;
        d++;
        src++;
    }

    // 添加字符串结束符 '\0'
    *d = '\0';

    return dest;
}

int main() {
    char dest[50] = "Hello";
    char src[] = " World";
    
    mystrcat(dest, src);
    printf("%s\n", dest);  // 输出 "Hello World"
    
    return 0;
}

### 2. 实现 `mystrcmp`
`mystrcmp` 函数用于比较两个字符串的大小。返回值如下:
- 0:如果两个字符串相等。
- 正值:如果第一个字符串大于第二个字符串。
- 负值:如果第一个字符串小于第二个字符串。
#include <stdio.h>

// 字符串比较函数
int mystrcmp(const char *str1, const char *str2) {
    while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2) {
        str1++;
        str2++;
    }

    // 返回两个字符的差值
    return *str1 - *str2;
}

int main() {
    char str1[] = "apple";
    char str2[] = "apricot";
    
    int result = mystrcmp(str1, str2);
    printf("%d\n", result);  // 输出一个负值,因为 'l' < 'r'
    
    return 0;
}

### 3. 实现 `mystrcpy`
`mystrcpy` 函数用于将源字符串复制到目标字符串。
#include <stdio.h>

// 字符串复制函数
char *mystrcpy(char *dest, const char *src) {
    char *d = dest;

    // 将源字符串的内容复制到目标字符串
    while (*src != '\0') {
        *d = *src;
        d++;
        src++;
    }

    // 添加字符串结束符 '\0'
    *d = '\0';

    return dest;
}

int main() {
    char dest[50];
    char src[] = "Hello World";
    
    mystrcpy(dest, src);
    printf("%s\n", dest);  // 输出 "Hello World"
    
    return 0;
}

### 代码思路讲解
1. **`mystrcat`**:
    - `char *d = dest;`:定义指针 `d` 指向目标字符串的开头。
    - `while (*d != '\0') { d++; }`:找到目标字符串的末尾。
    - `while (*src != '\0') { *d = *src; d++; src++; }`:将源字符串的每个字符复制到目标字符串的末尾。
    - `*d = '\0';`:追加字符串结束符。
    - 返回目标字符串。

2. **`mystrcmp`**:
    - `while (*str1 != '\0' && *str2 != '\0' && *str1 == *str2) { str1++; str2++; }`:逐字节比较两个字符串,直到遇到不同字符或到达字符串末尾。
    - `return *str1 - *str2;`:返回比较结果,差值为两个字符之间的差。

3. **`mystrcpy`**:
    - `char *d = dest;`:定义指针 `d` 指向目标字符串的开头。
    - `while (*src != '\0') { *d = *src; d++; src++; }`:将源字符串的每个字符复制到目标字符串中。
    - `*d = '\0';`:追加字符串结束符。
    - 返回目标字符串。

希望这些详细讲解对你有所帮助,如果有其他问题,随时提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-4 01:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表