• 面试题之strcpy / strlen / strcat / strcmp的实现


    /*-------------------------------------------------------------------------------------------------
    
                        面试题之strcpy / strlen / strcat / strcmp的实现;
    
    -------------------------------------------------------------------------------------------------*/
    
    #include <assert.h>
    #include <stdio.h>
    
    /*-------------------------------------------------------------------------------------------------
    
    一、字符串拷贝strcpy;
    函数strcpy的原型是 char* strcpy(char* des, const char* src);
    des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串;
    
    -------------------------------------------------------------------------------------------------*/
    
    char* strcpy(char* des, const char* src)
    {
        assert(des && src);
    
        char* tempAddr = des;
        while ('' != (*des++ = *src++))
        {
        }
        return tempAddr;
    }
    
    /*-------------------------------------------------------------------------------------------------
    
    // 答案考点;
    1. 要知道 strcpy 会拷贝’’;
    2. 还有要注意:源指针所指的字符串内容是不能修改的,因此应该声明为 const 类型;
    3. 要判断源指针和目的指针为空的情况,思维要严谨,这里使用assert;
    4. 要用一个临时变量保存目的串的首地址,最后返回这个首地址;
    5. 函数返回 char* 的目的是为了支持链式表达式,即strcpy可以作为其他函数的实参;
    
    -------------------------------------------------------------------------------------------------*/
    
    
    /*-------------------------------------------------------------------------------------------------
    
    二、字符串长度strlen;
    函数strlen的原型是 size_t strlen(const char *str);
    其中 size_t 就是 unsigned int;
    
    -------------------------------------------------------------------------------------------------*/
    
    size_t strlen(const char *str)
    {
        assert(str);
        size_t iLen = 0;
        while ('' != *str++)
        {
            ++iLen;
        }
        return iLen;
    }
    
    /*-------------------------------------------------------------------------------------------------
    
    // 答案考点;
    strlen 与 sizeof 的区别;
    sizeof是运算符,strlen是库函数;
    sizeof可以用类型、变量做参数,而strlen只能用 char* 变量做参数,且必须以结尾;
    sizeof是在编译的时候计算类型或变量所占内存的大小,而strlen的结果要在运行的时候才能计算出;
    来,用来计算字符串的长度;
    数组做sizeof的参数不退化,传递给strlen就退化为指针了;
    
    -------------------------------------------------------------------------------------------------*/
    
    
    /*-------------------------------------------------------------------------------------------------
    
    三、字符串连接strcat;
    函数strcat的原型是 char* strcat(char* des, char* src);
    des 和 src 所指内存区域不可以重叠 且 des 必须有足够的空间来容纳 src 的字符串;
    
    -------------------------------------------------------------------------------------------------*/
    
    char* strcat(char* des, char* src)
    {
        assert(des && src);
    
        char* tempAddr = des;
        while (*des != '')    // 移动到字符串末尾;
        {
            ++des;
        }
        while ('' != (*des++ = *src++))
        {
        }
        return tempAddr;
    }
    
    /*-------------------------------------------------------------------------------------------------
    
    // 答案考点;
    移动到字符串末尾 后 同strcpy处理;
    
    -------------------------------------------------------------------------------------------------*/
    
    
    /*-------------------------------------------------------------------------------------------------
    
    四、字符串比较strcmp;
    函数strcmp的原型是 int strcmp(const char *s1, const char *s2);
    若s1 == s2,返回零;
    若s1 > s2,返回正数;
    若s1 < s2,返回负数;
    即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇为止;
    
    -------------------------------------------------------------------------------------------------*/
    
    int strcmp(const char *s1, const char *s2)
    {
        assert(s1 && s2);
        while (*s1 == *s2)
        {
            if ('' == *s1 )
            {
                return 0;
            }
            s1++;
            s2++;
        }
        return *s1 - *s2;
    }
    
    /*-------------------------------------------------------------------------------------------------
    
    // 答案考点;
    移动到字符串末尾 后 同strcpy处理;
    
    -------------------------------------------------------------------------------------------------*/
    
    void main()
    {
        // strcpy test;
        {
            char dest1[5];
            char dest2[20];
            char src[10] = "abcdef";
    
            int iLen1 = strlen(strcpy(dest1, src));
            int iLen2 = strlen(strcpy(dest2, src));
    
            int i = 0;
        }
    
        // strcat test;
        {
            char dest1[6] = "12345";
            char dest2[20] = "12345";
            char src[10] = "abcdef";
    
            int iLen1 = strlen(strcat(dest1, src));
            int iLen2 = strlen(strcat(dest2, src));
    
            int i = 0;
        }
    
        // strcmp test;
        {
            char str1[10] = "12345";
            char str2[20] = "12345";
            char str3[20] = "12354";
            char str4[20] = "12234";
    
            int iRes1 = strcmp(str1, str2);
            int iRes2 = strcmp(str1, str3);
            int iRes3 = strcmp(str1, str4);
            int iRes4 = strcmp(str3, str4);
    
            int i = 0;
        }
    
        // 最后析构dest1出错 越界;
    }
    
    
    // memcpy 与 memmove 的区别;
  • 相关阅读:
    python安装cnstd卡住
    _、__、__xx__之间的差别
    Celery模块使用
    同一主机,开启多个不同端口的redis进程
    php配置变更记录
    Linux安装Nodejs
    ElasticSearch中term和match探索
    Centos安装elasticsearch,php连接使用
    centos8自定义目录安装php7.3
    centos8自定义目录安装nginx
  • 原文地址:https://www.cnblogs.com/Kingfans/p/6496314.html
Copyright © 2020-2023  润新知