C语言中strcpy、strcat、strstr、strchr、strcmp、memcpy、memmove函数的实现

本文详细介绍了C语言中常见的字符串操作函数,包括strcpy、strcat、strstr、strchr、strcmp、memcpy和memmove的实现原理及代码示例,有助于读者深入理解这些函数的工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、strcpy函数

(1)、函数功能:

strcpy函数的意思是:把字符串s2中的内容copy到s1中,连字符串结束标志也一起copy.

(2)、代码实现

#include <stdio.h>
#include <stdlib.h>
const char* my_strcpy (char* arr2, const char* arr1)
{
    const char *ret = arr1;
    while (*arr1)
    {
        *arr2 = *arr1;
        arr2++;
        arr1++;
    }
    *arr2 = *arr1;//此时arr1和arr2都指向'\0'
    return ret;
}
int main()
{
    char arr1[] = {"abcdefgh"};
    char arr2[10] = {"0"};
    my_strcpy (arr2, arr1);
    printf ("arr1 = {%s}\n", arr1);
    printf ("arr2 = {%s}\n", arr2);
    system ("pause");
    return 0;
}
/*
运行结果:
arr1 = {abcdefgh}
arr2 = {abcdefgh}
请按任意键继续. . .
*/

2.实现strcat

(1)、函数功能:

char *strcat(char *dest, const char *str);
strcat() 会将参数 str 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。

注意:dest 与str所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。

(2)、代码实现

#include <stdio.h>
#include <stdlib.h>
char* my_strcat(char *dest,const char *str)
{
    char *ret = dest;
    while (*dest)//使dest指向'\0'
    {
        dest ++;
    }
    while(*str)
    {
        *dest++ = *str++;
    }
    *dest = *str;//让此时的*dest = '\0'
    return ret;
}
int main()
{
    char arr1[15] = "abcdefg";
    char arr2[] = "hij";
    printf ("调用前:\narr1 = %s\narr2 = %s\n", arr1, arr2);
    my_strcat(arr1, arr2);
    printf ("调用后:\narr1 = %s\narr2 = %s\n", arr1, arr2);
    system ("pause");
    return 0;
}
/*
运行结果:
调用前:
arr1 = abcdefg
arr2 = hij
调用后:
arr1 = abcdefghij
arr2 = hij
请按任意键继续. . .
*/

3.实现strstr

(1)函数功能:

strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

(2)代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

char* my_strstr(const char *arr1, const char *arr2)//str2是不是str1的子串
{
    char *p = (char *)arr1;
    char *q = (char *)arr2;
    char *ret = NULL;
    assert(arr1 != NULL);
    assert(arr2 != NULL);
    if (*arr2 == '\0')
    {
        return NULL;
    }
    while(*p)//arr1不等‘\0’
    {
        ret = p;
        while (*p == *q && *q && *p)
        {
            q++;
            p++;
        }
        if(*q == '\0')
        {
            return ret;
        }
        else
        {
            p = ret+1;
            q = (char*)arr2;
            /*p++;*/
        }
    }
    return NULL;
}

int main()
{
    char arr1[10] = "abbbbbcde";
    char arr2[5] = "bbc";
    printf ("%s\n", strstr(arr1, arr2));
    printf ("%s\n", my_strstr(arr1, arr2));
    system ("pause");
    return 0;
}
/*
运行结果:
bbcde
bbcde
请按任意键继续. . .
*/

4.实现strchr

(1)函数功能

从字符串arr中寻找字符a第一次出现的位置,返回指向第一次出现字符character位置的指针,如果没找到则返回NULL。

(2)代码实现

#include <stdio.h>
#include <stdlib.h>
char* my_strchr(char* arr, char a)
{
    while (*arr)
    {
        if(*arr != a)
        {
            arr++;
        }
        else
        {
            return arr;
        }
    }
    return NULL;
}
int main()
{
    char arr[] = "abdenddlmf";
    char a = 'd';
    printf ("%s\n", my_strchr(arr, a));
    system ("pause");
    return 0;
}
/*
运行结果:
denddlmf
请按任意键继续. . .
*/

5.实现strcmp

(1)函数功能:

int my_strcmp (const char* dest, const char* str)
如果dest > str,则返回值大于0,####如果dest = str,则返回值等于0,如果dest < str ,则返回值小于0。
字符大小是按照字符的字典序列进行排列的。

(2)代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int my_strcmp (const char* dest, const char* str)
{
    assert(dest != NULL);
    assert(str != NULL);

    while (*dest!='\0' && *str!='\0')
    {
        if(*dest != *str)
        {
            return *dest-*str;;
        }
        dest++;
        str++;
    }
    return 0;
}
int main()
{
    char arr1[] = "bnjfdbgl";
    char arr2[] = "anjfdbgj";
    printf ("%d\n", my_strcmp (arr1, arr2));
    system ("pause");
    return 0;
}
/*
运行结果:
1
请按任意键继续. . .
*/

6.实现memcpy

(1)代码功能:

函数原型:void* my_memcpy(void* dest,const void* src, size_t n)
函数功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

(2)代码实现:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
void* my_memcpy(void* dest,const void* src, size_t n)
{
    void *ret = dest;
    while(n)
    {
        *(char *)dest = *(char *)src;
        dest = (char *)dest+1;
        src = (char *)src+1;
        n--;
    }
    return ret;

}

int main()
{

    char arr1[10] = "bfdinfjs";
    char arr2[10] = "bfdinfjs";
    char arr3[10] = "bb";

    memcpy(arr1+5, arr3, 2);
    my_memcpy(arr2+5, arr3, 2);

    printf ("arr1 = %s\n", arr1);
    printf ("arr2 = %s\n", arr2);
    printf ("arr3 = %s\n", arr3);
    system ("pause");
    return 0;
}
/*
运行结果:
arr1 = bfdinbbs
arr2 = bfdinbbs
arr3 = bb
请按任意键继续. . .
*/

7.实现memmove

(1)函数功能:

与mencpy相同,不同的是当dest和 src 重叠,函数仍能正常工作。

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void* my_memmove(void* dest, const void* src, size_t n)
{
    void* ret = dest; 
    if (src<dest)
    {
        while(n--)
        {
            *((char *)dest+n) = *((char *)src+n);
        }
    }
    else
    {
        while(n)
        {
            *(char *)dest = *(char *)src;
            dest = (char *)dest + 1;
            src = (char *)src +1;
            n--;
        }
    }
    return ret;
}
void print (int *p, int sz, int num)
{
    int i = 0;
    printf ("arr%d\n", num);
    for (i=0; i<sz; i++)
    {
        printf ("%d ",p[i]);
    }
    printf ("\n");
}
int main()
{
    int arr1[] = {1, 2, 3, 4, 5, 6};
    int arr2[] = {1, 2, 3, 4, 5, 6};
    int sz = sizeof(arr1)/sizeof(arr1[0]);
    memmove (arr1+1, arr1, 12);
    my_memmove(arr2+1, arr2, 12);

    print(arr1, sz, 1);
    print(arr2, sz, 2);
    system ("pause");
    return 0;
}
/*
运行结果:
arr1
1 1 2 3 5 6
arr2
1 1 2 3 5 6
请按任意键继续. . .
*/
1. atof(): 将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = atof(str); printf("%f", num); ``` 结果为:3.140000 2. atoi(): 将字符串转换为int类型的值。 例如: ```c++ char str[] = "1234"; int num = atoi(str); printf("%d", num); ``` 结果为:1234 3. atol(): 将字符串转换为long类型的值。 例如: ```c++ char str[] = "1234567"; long num = atol(str); printf("%ld", num); ``` 结果为:1234567 4. strtod(): 类似于atof(),将字符串转换为double类型的值。 例如: ```c++ char str[] = "3.14"; double num = strtod(str, NULL); printf("%f", num); ``` 结果为:3.140000 5. strtol(): 将字符串转换为long类型的值,同时支持指定转换的基数(例如10进制、16进制等)和错误检查。 例如: ```c++ char str[] = "0110"; long num = strtol(str, NULL, 2); printf("%ld", num); ``` 结果为:6 6. strtoul(): 类似于strtol(),不过返回的是无符号的long类型。 例如: ```c++ char str[] = "0xA"; unsigned long num = strtoul(str, NULL, 16); printf("%lu", num); ``` 结果为:10 7. memset(): 将一段内存区域设置为指定的值。 例如: ```c++ char str[10]; memset(str, 'a', sizeof(str)); printf("%s", str); ``` 结果为:aaaaaaa 8. memcpy(): 将一段内存区域的内容复制到另一段内存区域。 例如: ```c++ char src[] = "hello"; char dst[10]; memcpy(dst, src, sizeof(src)); printf("%s", dst); ``` 结果为:hello 9. memmove(): 和memcpy()类似,但是保证在有重叠的情况下会正确工作。 例如: ```c++ char str[] = "hello"; memmove(str + 2, str, 3); printf("%s", str); ``` 结果为:hehlo 10. memcmp(): 比较两段内存区域的内容是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "Hello"; int result = memcmp(str1, str2, 5); printf("%d", result); ``` 结果为:32(h和H的ASCII码差值) 11. memchr(): 在一段内存区域中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = (char*)memchr(str, 'l', 5); printf("%s", ptr); ``` 结果为:ll 12. strcpy(): 将一个字符串复制到另一个字符串。 例如: ```c++ char src[] = "hello"; char dst[10]; strcpy(dst, src); printf("%s", dst); ``` 结果为:hello 13. strncpy(): 类似于strcpy(),不过只会复制指定长度的字符。 例如: ```c++ char src[] = "hello"; char dst[10]; strncpy(dst, src, 3); dst[3] = '\0'; printf("%s", dst); ``` 结果为:hel 14. strcat(): 将一个字符串附加到另一个字符串的末尾。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strcat(str1, str2); printf("%s", str1); ``` 结果为:helloworld 15. strncat(): 类似于strcat(),不过只会附加指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; strncat(str1, str2, 3); printf("%s", str1); ``` 结果为:helloworld 16. strcmp(): 比较两个字符串是否相等。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strcmp(str1, str2); printf("%d", result); ``` 结果为:-15 17. strncmp(): 类似于strcmp(),不过只会比较指定长度的字符。 例如: ```c++ char str1[] = "hello"; char str2[] = "world"; int result = strncmp(str1, str2, 3); printf("%d", result); ``` 结果为:0 18. strchr(): 在一个字符串中搜索指定的字符,并返回指向该字符的指针。 例如: ```c++ char str[] = "hello"; char* ptr = strchr(str, 'l'); printf("%s", ptr); ``` 结果为:llo 19. strrchr(): 类似于strchr(),不过会从字符串的末尾开始搜索。 例如: ```c++ char str[] = "hello"; char* ptr = strrchr(str, 'l'); printf("%s", ptr); ``` 结果为:lo 20. strstr(): 在一个字符串中搜索指定的子字符串,并返回指向该子字符串的指针。 例如: ```c++ char str[] = "hello world"; char* ptr = strstr(str, "world"); printf("%s", ptr); ``` 结果为:world
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值