天若有道,帮帮我给下面每一行都做一下注释吧,新学生看不懂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,其实没必要