关于这个答案的问题,如何解决?(语言-c语言)

天若有道,帮帮我给下面每一行都做一下注释吧,新学生看不懂csdn'上的高深答案捏

#include
#include
#include "dsstring.h"
 
void* Memset(void* s, int c, size_t n)
{
    if (NULL == s || n < 0)
        return NULL;
    char* tmpS = (char*)s;
    while (n-- > 0)
        *tmpS++ = c;
    return s;
}
 
char* Strncat(char* dest, const char* source, int num)
{
    char* ret = dest;
 
    while (*dest != '\0')
    {
        dest++;
    }
    while (num && (*dest++ = *source++))
    {
        num--;
    }
    return ret;
}
 
char* Strcat(char* dest, const char* src)
{
    char* ret = dest;
    //1.找到目的字符串的'\0'
    while (*dest != '\0')
    {
        dest++;
    }
    //2.追加
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
 
int Strlen(char* str)
{
    int count = 0;
    while (*str != '\0')
    {
        str++;
        count++;
    }
    return count;
}
 
int Strncmp(const char* str1, const char* str2, int size) {
    for (int i = 0; i < size; ++i) {
        if (*(str1 + i) > *(str2 + i)) {
            return 1;
        }
        else if (*(str1 + i) < *(str2 + i)) {
            return -1;
        }
        if (*(str1 + i) == 0 || *(str2 + i) == 0) {
            break;
        }
    }
    return 0;
}
 
 
int str_replace(const char* in, char* out, int outlen, const char* oldstr, const char* newstr) {
    Memset(out, 0, outlen);
    int count = 0;
    for (int i = 0; i < Strlen(in); i++) {
        if (!Strncmp(in + i, oldstr, Strlen(oldstr)) && (Strlen(out) + Strlen(newstr) < outlen)) {
                //查找到目标字符串
                if(Strlen(in) + (Strlen(newstr) - Strlen(oldstr)) * (count + 1) + 1 > outlen){
                    Strcat(out, in + i);
                    Strcat(out, "\0");
                    return count;
                }
                Strcat(out, newstr);
                //把新字符串贴到缓冲字符串里
                i += Strlen(oldstr) - 1;
                count++;
        }
        else { //如果没有找到
            Strncat(out, in + i, 1);//将该字符写入缓冲字符串数组
        }
    }
    return count;
}

写了两个函数的注释,仅供参考!太多了。打字累,剩下的自己尝试理解,不懂再问吧
Strncat这个函数跟标准链接库的函数实现相差甚远
因为这里的Strncat遇到空字符没有终止,最后也没添加结尾符。

#include<stdio.h>
#include<stdlib.h>
#include "dsstring.h"

/* 其实下面这些函数是要实现标准库中同名的同样功能
   除非自己练手加深理解。否则尽量别用,因为标准链接库的函数才是最严谨的!

 */
/* 
   功能:内存设置
   参数s,无符号指针,就是要设置的对象(内存区域)
   参数c,就是要设置的值 参数n,设置个数 */
void *Memset(void *s, int c, size_t n)
{
    if (NULL == s || n < 0        /* 如果是空指针,或设置个数小于0时返回空指针 
                                 */ )
        return NULL;

    char *tmpS = (char *)s;
    /* 
       把无符号指针s转换乘字符指针赋值给tmpS指针 */

    while (n-- > 0)
        /* 
           循环n次,的简单写法 */
        *tmpS++ = c;
    /* tmpS所指向的内存区按字节逐个赋值为c
       每赋值一个,指针向前移动一个字节,也就是要把一个内存区域的连续n个字节都赋值为c(c是自变量具体什么值从实参中传入的) 
     */
    return s;
    /* 返回这块被赋值后的内存的首地址,也就是最低地址 */
}



char *Strncat(char *dest, const char *source, int num)
{
    char *ret = dest;
    while (*dest != '\0')
    {                            /* 
                                   把dest指针移动到该字串的结尾读处 
                                 */
        dest++;
    }


    while (num && (*dest++ = *source++))
    {
        /* 从dest的末尾空字符处开始(要覆盖这个空字符),把source逐个字符赋值到dest,复制一次彼此地址都增加1 
         */
        num--;
        /* 赋值num次,也就是追加num个字符但dest的尾部 */
    }

    /* 
       这里缺少了必要代码*dest='\0',结尾符可能没有复制到dest的最后,导致字符串不完整。处理可能会出错 
     */
    return ret;
}

char *Strcat(char *dest, const char *src)
{
    char *ret = dest;
    // 1.找到目的字符串的'\0'
    while (*dest != '\0')
    {
        dest++;
    }
    // 2.追加
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int Strlen(char *str)
{
    int count = 0;
    while (*str != '\0')
    {
        str++;
        count++;
    }
    return count;
}

int Strncmp(const char *str1, const char *str2, int size)
{
    for (int i = 0; i < size; ++i)
    {
        if (*(str1 + i) > *(str2 + i))
        {
            return 1;
        }
        else if (*(str1 + i) < *(str2 + i))
        {
            return -1;
        }
        if (*(str1 + i) == 0 || *(str2 + i) == 0)
        {
            break;
        }
    }
    return 0;
}

int str_replace(const char *in, char *out, int outlen, const char *oldstr, const char *newstr)
{
    Memset(out, 0, outlen);
    int count = 0;
    for (int i = 0; i < Strlen(in); i++)
    {
        if (!Strncmp(in + i, oldstr, Strlen(oldstr)) && (Strlen(out) + Strlen(newstr) < outlen))
        {
            // 查找到目标字符串
            if (Strlen(in) + (Strlen(newstr) - Strlen(oldstr)) * (count + 1) + 1 > outlen)
            {
                Strcat(out, in + i);
                Strcat(out, "\0");
                return count;
            }
            Strcat(out, newstr);
            // 把新字符串贴到缓冲字符串里
            i += Strlen(oldstr) - 1;
            count++;
        }
        else
        {                        // 如果没有找到
            Strncat(out, in + i, 1);    // 将该字符写入缓冲字符串数组
        }
    }
    return count;
}


关键是你英文懂不懂
memset是将数组设置为某个值
strcat是连接字符串
strlen取得字符串长度
strcmp比较字符串
str_replace,替换字符串。
dest 目标,src 源
然后都是很直观简单的循环,顺便说下 Strncmp 这里传入size,其实没必要