Tex-mind 2023-04-11 20:06 采纳率: 50%
浏览 20
已结题

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

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

#include<stdio.h>
#include<stdlib.h>
#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;
}

  • 写回答

2条回答 默认 最新

  • 滴水不穿石 2023-04-11 21:23
    关注

    写了两个函数的注释,仅供参考!太多了。打字累,剩下的自己尝试理解,不懂再问吧
    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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月10日
  • 已采纳回答 5月2日
  • 创建了问题 4月11日