Error[8]: Undefined offset: 36, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

0.前言

1.长度不受限制的字符串函数

1.1strlen

1.1.1模拟实现

1.1.2效果展示

1.2strcpy

1.2.1模拟实现

1.2.2效果展示

1.3strcat

1.3.1模拟实现

1.3.2结果展示

 1.4strcmp

1.4.1模拟实现

1.4.2结果展示 

 二、长度受限制的字符串函数

2.1strncpy

 2.1.1模拟实现

2.1.2结果展示

 2.2strncat

2.2.1模拟实现

2.2.2结果展示

 2.3strncmp

2.3.1模拟实现

2.3.2结果展示


0.前言

C语言对字符串的处理比较频繁,但是C语言本身并没有处理字符串类型的函数。

1.长度不受限制的字符串函数 1.1strlen

计算字符串str长度的函数。

size_t  strlen( const char* str )

 strlen统计的是“\0”以前的字符串长度;

strlen返回值的类型为无符号整形(相减时,不会出现负数的情况);

参数指向的字符串必须以"\0"结束;

strlen的模拟实现。

1.1.1模拟实现
#include

int mystrlen(const char* str)
{
	int count = 0;
	while (*str++)
		count++;
	return count;
}

int main()
{
	char str[] = "asdfgh";
	int len = mystrlen(str);
	printf("%d\n", len);
	return 0;

}
1.1.2效果展示

 

1.2strcpy

复制字符串的函数。将source字符串的内容复制到destination里面。

char* strcpy(char* destination, const char* source)

源字符串必须以"\0"结束;

destination必须有足够大的空间;

 目标空间必须可变;

学会模拟实现

1.2.1模拟实现
#include

char* mystrcpy(char* str2, const char* str1)
{
	assert(str2 && str1);
	char* ret = str2;
	while (*ret++ = *str1++)
	{
		;
	}
	return str2;
}

int main()
{
	char str1[] = "asdfg";
	char str2[30];
	printf("%s\n", mystrcpy(str2, str1));
	return 0;

}

/*注:这里我们使用assert函数进行断言,来判断两个指针是否为NULL。

1.2.2效果展示

 

1.3strcat

追加字符串的函数。将source字符串的内容追加到destination后面

char*  strcat ( char*  destination, const char* source );

目标字符串和源字符串必须以“\0”结束;

目标空间足够大;

目标空间可修改;

自己不能追加自己;

1.3.1模拟实现
#include
char* mystrcat(char* dest, const char* cour)
{
	assert(dest);
	char* ret = dest;
	while (*ret)
	{
		ret++;
	}
	while (*ret++ = *cour++)
	{
		;
	}
	return dest;

}
int main()
{
	char dest[20] = { "asdfg" };
	char sour[] = { "zxcv"};
	printf("%s\n", mystrcat(dest, sour));
	return 0;
}
1.3.2结果展示

 1.4strcmp

用于比较两个字符串的函数。

int  strcmp ( const char*  str1,  const char*  str2 ); 

 标准规定:

        str1大于str2的情况,结果返回一个>0的值;

        str1等于str2的情况,结果返回一个=0的值;

        str1小于str2的情况,结果返回一个<0的值。

比较方法:逐个字符,按照ASCⅡ的值进行比较。 

1.4.1模拟实现
int mystrcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (str1 == 'char*')
			return 0;
		str1++;
		str2++;
	}
	return (int)*str1 - (int)*str2;
		
}

int main()
{
	char str1[] = { "asdfg" };
	char str2[] = { "asdfgh" };
	printf("%d\n", mystrcmp(str1, str2));
	return 0;
}
1.4.2结果展示 

 二、长度受限制的字符串函数 2.1strncpy

复制规定字数的字符串。

char*  strncpy (const char*  destination, size_t   source, char* num);

拷贝num个字符从源字符串,到目标字符串空间中;

源字符串必须以"\0"结束;

destination必须有足够大的空间;

 目标空间必须可变;

如果num大于源字符串的长度,那么用“\0”来补位。

 2.1.1模拟实现
#include
#include

char* mystrncpy(char* dest, char* sour, size_t num)
{
	assert(dest && sour);
	char* ret = dest;
	while (num && (*ret = *sour))
	{
		ret++;
		sour++;
		num--;
	}
	if (num)
	{
		*ret++ = '\0';
		num--;
	}
	return dest;
}

int main()
{
	char dest[20] = { "hello world"};
	char sour[] = { "xxxxxxxx" };
	printf("%s\n", mystrncpy(dest, sour, 5));
	return 0;
		
}
2.1.2结果展示

 2.2strncat

追加num个字符串的函数。

char*  strncat ( char*  destination,  size_t source,  小于 num);

 如果源字符串的长度num,这复制到终止符即可。2.2.1模拟实现

目标字符串和源字符串必须以“\0”结束;

目标空间足够大;

目标空间可修改;

自己不能追加自己;

char* mystrncat(char* dest, const char* sour, size_t num) { assert(dest && sour); char* ret = dest; while (*ret) { ret++; } while(num-- && (*ret++=*sour++)) { ; } return dest; } int main() { char str1[20] = { "asdfg" }; char str2[] = { "zxcvb" }; printf("%s\n", mystrncat(str1, str2, 3)); return 0; }
/*注:

int这里mystrncat中while(num--  &&  (*ret++=*sour++)),这两个条件的位置不能调换,否则将多复制一个字符串。

2.2.2结果展示

 2.3strncmp

用于比较前num个字符的大小。

char*   strncmp ( char* str1, size_t  str2,  int mystrncmp(char* str1, char* str2, size_t num) { assert(str1 && str2); while ((*str1++ == *str2++) && num--) { if (*str1 == '[+++]') return 0; } if (num == 0) return 0; else return (int)*str1 - (int)*str2; } int main() { char str1[] = { "asdfg" }; char str2[] = { "asdfgh" }; printf("%d\n", mystrncmp(str1, str2, 3)); return 0; }  num);

 标准规定:

        str1大于str2的情况,结果返回一个>0的值;

        str1等于str2的情况,结果返回一个=0的值;

        str1小于str2的情况,结果返回一个<0的值。

比较方法:逐个字符,按照ASCⅡ的值进行比较 ,直到结果相等或num=0; 

2.3.1模拟实现
[+++]
2.3.2结果展示

 

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 37, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

目录

0.前言

1.长度不受限制的字符串函数

1.1strlen

1.1.1模拟实现

1.1.2效果展示

1.2strcpy

1.2.1模拟实现

1.2.2效果展示

1.3strcat

1.3.1模拟实现

1.3.2结果展示

 1.4strcmp

1.4.1模拟实现

1.4.2结果展示 

 二、长度受限制的字符串函数

2.1strncpy

 2.1.1模拟实现

2.1.2结果展示

 2.2strncat

2.2.1模拟实现

2.2.2结果展示

 2.3strncmp

2.3.1模拟实现

2.3.2结果展示


0.前言

C语言对字符串的处理比较频繁,但是C语言本身并没有处理字符串类型的函数。

1.长度不受限制的字符串函数 1.1strlen

计算字符串str长度的函数。

size_t  strlen( const char* str )

 strlen统计的是“\0”以前的字符串长度;

strlen返回值的类型为无符号整形(相减时,不会出现负数的情况);

参数指向的字符串必须以"\0"结束;

strlen的模拟实现。

1.1.1模拟实现
#include

int mystrlen(const char* str)
{
	int count = 0;
	while (*str++)
		count++;
	return count;
}

int main()
{
	char str[] = "asdfgh";
	int len = mystrlen(str);
	printf("%d\n", len);
	return 0;

}
1.1.2效果展示

 

1.2strcpy

复制字符串的函数。将source字符串的内容复制到destination里面。

char* strcpy(char* destination, const char* source)

源字符串必须以"\0"结束;

destination必须有足够大的空间;

 目标空间必须可变;

学会模拟实现

1.2.1模拟实现
#include

char* mystrcpy(char* str2, const char* str1)
{
	assert(str2 && str1);
	char* ret = str2;
	while (*ret++ = *str1++)
	{
		;
	}
	return str2;
}

int main()
{
	char str1[] = "asdfg";
	char str2[30];
	printf("%s\n", mystrcpy(str2, str1));
	return 0;

}

/*注:这里我们使用assert函数进行断言,来判断两个指针是否为NULL。

1.2.2效果展示

 

1.3strcat

追加字符串的函数。将source字符串的内容追加到destination后面

char*  strcat ( char*  destination, const char* source );

目标字符串和源字符串必须以“\0”结束;

目标空间足够大;

目标空间可修改;

自己不能追加自己;

1.3.1模拟实现
#include
char* mystrcat(char* dest, const char* cour)
{
	assert(dest);
	char* ret = dest;
	while (*ret)
	{
		ret++;
	}
	while (*ret++ = *cour++)
	{
		;
	}
	return dest;

}
int main()
{
	char dest[20] = { "asdfg" };
	char sour[] = { "zxcv"};
	printf("%s\n", mystrcat(dest, sour));
	return 0;
}
1.3.2结果展示

 1.4strcmp

用于比较两个字符串的函数。

int  strcmp ( const char*  str1,  const char*  str2 ); 

 标准规定:

        str1大于str2的情况,结果返回一个>0的值;

        str1等于str2的情况,结果返回一个=0的值;

        str1小于str2的情况,结果返回一个<0的值。

比较方法:逐个字符,按照ASCⅡ的值进行比较。 

1.4.1模拟实现
int mystrcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (str1 == 'char*')
			return 0;
		str1++;
		str2++;
	}
	return (int)*str1 - (int)*str2;
		
}

int main()
{
	char str1[] = { "asdfg" };
	char str2[] = { "asdfgh" };
	printf("%d\n", mystrcmp(str1, str2));
	return 0;
}
1.4.2结果展示 

 二、长度受限制的字符串函数 2.1strncpy

复制规定字数的字符串。

char*  strncpy (const char*  destination, size_t   source, char* num);

拷贝num个字符从源字符串,到目标字符串空间中;

源字符串必须以"\0"结束;

destination必须有足够大的空间;

 目标空间必须可变;

如果num大于源字符串的长度,那么用“\0”来补位。

 2.1.1模拟实现
#include
#include

char* mystrncpy(char* dest, char* sour, size_t num)
{
	assert(dest && sour);
	char* ret = dest;
	while (num && (*ret = *sour))
	{
		ret++;
		sour++;
		num--;
	}
	if (num)
	{
		*ret++ = '\0';
		num--;
	}
	return dest;
}

int main()
{
	char dest[20] = { "hello world"};
	char sour[] = { "xxxxxxxx" };
	printf("%s\n", mystrncpy(dest, sour, 5));
	return 0;
		
}
2.1.2结果展示

 2.2strncat

追加num个字符串的函数。

char*  strncat ( char*  destination,  size_t source,  小于 num);

 如果源字符串的长度num,这复制到终止符即可。2.2.1模拟实现

目标字符串和源字符串必须以“\0”结束;

目标空间足够大;

目标空间可修改;

自己不能追加自己;

char* mystrncat(char* dest, const char* sour, size_t num) { assert(dest && sour); char* ret = dest; while (*ret) { ret++; } while(num-- && (*ret++=*sour++)) { ; } return dest; } int main() { char str1[20] = { "asdfg" }; char str2[] = { "zxcvb" }; printf("%s\n", mystrncat(str1, str2, 3)); return 0; }
/*注:

int这里mystrncat中while(num--  &&  (*ret++=*sour++)),这两个条件的位置不能调换,否则将多复制一个字符串。

2.2.2结果展示

 2.3strncmp

用于比较前num个字符的大小。

char*   strncmp ( char* str1, size_t  str2,  int mystrncmp(char* str1, char* str2, size_t num) { assert(str1 && str2); while ((*str1++ == *str2++) && num--) { if (*str1 == '') return 0; } if (num == 0) return 0; else return (int)*str1 - (int)*str2; } int main() { char str1[] = { "asdfg" }; char str2[] = { "asdfgh" }; printf("%d\n", mystrncmp(str1, str2, 3)); return 0; }  num);

 标准规定:

        str1大于str2的情况,结果返回一个>0的值;

        str1等于str2的情况,结果返回一个=0的值;

        str1小于str2的情况,结果返回一个<0的值。

比较方法:逐个字符,按照ASCⅡ的值进行比较 ,直到结果相等或num=0; 

2.3.1模拟实现
[+++]
2.3.2结果展示

 

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
字符函数和字符串函数(一)_C_内存溢出

字符函数和字符串函数(一)

字符函数和字符串函数(一),第1张

目录

0.前言

1.长度不受限制的字符串函数

1.1strlen

1.1.1模拟实现

1.1.2效果展示

1.2strcpy

1.2.1模拟实现

1.2.2效果展示

1.3strcat

1.3.1模拟实现

1.3.2结果展示

 1.4strcmp

1.4.1模拟实现

1.4.2结果展示 

 二、长度受限制的字符串函数

2.1strncpy

 2.1.1模拟实现

2.1.2结果展示

 2.2strncat

2.2.1模拟实现

2.2.2结果展示

 2.3strncmp

2.3.1模拟实现

2.3.2结果展示


0.前言

C语言对字符串的处理比较频繁,但是C语言本身并没有处理字符串类型的函数。

1.长度不受限制的字符串函数 1.1strlen

计算字符串str长度的函数。

size_t  strlen( const char* str )

 strlen统计的是“\0”以前的字符串长度;

strlen返回值的类型为无符号整形(相减时,不会出现负数的情况);

参数指向的字符串必须以"\0"结束;

strlen的模拟实现。

1.1.1模拟实现
#include

int mystrlen(const char* str)
{
	int count = 0;
	while (*str++)
		count++;
	return count;
}

int main()
{
	char str[] = "asdfgh";
	int len = mystrlen(str);
	printf("%d\n", len);
	return 0;

}
1.1.2效果展示

 

1.2strcpy

复制字符串的函数。将source字符串的内容复制到destination里面。

char* strcpy(char* destination, const char* source)

源字符串必须以"\0"结束;

destination必须有足够大的空间;

 目标空间必须可变;

学会模拟实现

1.2.1模拟实现
#include

char* mystrcpy(char* str2, const char* str1)
{
	assert(str2 && str1);
	char* ret = str2;
	while (*ret++ = *str1++)
	{
		;
	}
	return str2;
}

int main()
{
	char str1[] = "asdfg";
	char str2[30];
	printf("%s\n", mystrcpy(str2, str1));
	return 0;

}

/*注:这里我们使用assert函数进行断言,来判断两个指针是否为NULL。

1.2.2效果展示

 

1.3strcat

追加字符串的函数。将source字符串的内容追加到destination后面

char*  strcat ( char*  destination, const char* source );

目标字符串和源字符串必须以“\0”结束;

目标空间足够大;

目标空间可修改;

自己不能追加自己;

1.3.1模拟实现
#include
char* mystrcat(char* dest, const char* cour)
{
	assert(dest);
	char* ret = dest;
	while (*ret)
	{
		ret++;
	}
	while (*ret++ = *cour++)
	{
		;
	}
	return dest;

}
int main()
{
	char dest[20] = { "asdfg" };
	char sour[] = { "zxcv"};
	printf("%s\n", mystrcat(dest, sour));
	return 0;
}
1.3.2结果展示

 1.4strcmp

用于比较两个字符串的函数。

int  strcmp ( const char*  str1,  const char*  str2 ); 

 标准规定:

        str1大于str2的情况,结果返回一个>0的值;

        str1等于str2的情况,结果返回一个=0的值;

        str1小于str2的情况,结果返回一个<0的值。

比较方法:逐个字符,按照ASCⅡ的值进行比较。 

1.4.1模拟实现
int mystrcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (str1 == 'char*')
			return 0;
		str1++;
		str2++;
	}
	return (int)*str1 - (int)*str2;
		
}

int main()
{
	char str1[] = { "asdfg" };
	char str2[] = { "asdfgh" };
	printf("%d\n", mystrcmp(str1, str2));
	return 0;
}
1.4.2结果展示 

 二、长度受限制的字符串函数 2.1strncpy

复制规定字数的字符串。

char*  strncpy (const char*  destination, size_t   source, char* num);

拷贝num个字符从源字符串,到目标字符串空间中;

源字符串必须以"\0"结束;

destination必须有足够大的空间;

 目标空间必须可变;

如果num大于源字符串的长度,那么用“\0”来补位。

 2.1.1模拟实现
#include
#include

char* mystrncpy(char* dest, char* sour, size_t num)
{
	assert(dest && sour);
	char* ret = dest;
	while (num && (*ret = *sour))
	{
		ret++;
		sour++;
		num--;
	}
	if (num)
	{
		*ret++ = '\0';
		num--;
	}
	return dest;
}

int main()
{
	char dest[20] = { "hello world"};
	char sour[] = { "xxxxxxxx" };
	printf("%s\n", mystrncpy(dest, sour, 5));
	return 0;
		
}
2.1.2结果展示

 2.2strncat

追加num个字符串的函数。

char*  strncat ( char*  destination,  size_t source,  小于 num);

 如果源字符串的长度num,这复制到终止符即可。2.2.1模拟实现

目标字符串和源字符串必须以“\0”结束;

目标空间足够大;

目标空间可修改;

自己不能追加自己;

char* mystrncat(char* dest, const char* sour, size_t num) { assert(dest && sour); char* ret = dest; while (*ret) { ret++; } while(num-- && (*ret++=*sour++)) { ; } return dest; } int main() { char str1[20] = { "asdfg" }; char str2[] = { "zxcvb" }; printf("%s\n", mystrncat(str1, str2, 3)); return 0; }
/*注:

int这里mystrncat中while(num--  &&  (*ret++=*sour++)),这两个条件的位置不能调换,否则将多复制一个字符串。

2.2.2结果展示

 2.3strncmp

用于比较前num个字符的大小。

char*   strncmp ( char* str1, size_t  str2,  int mystrncmp(char* str1, char* str2, size_t num) { assert(str1 && str2); while ((*str1++ == *str2++) && num--) { if (*str1 == '') return 0; } if (num == 0) return 0; else return (int)*str1 - (int)*str2; } int main() { char str1[] = { "asdfg" }; char str2[] = { "asdfgh" }; printf("%d\n", mystrncmp(str1, str2, 3)); return 0; }  num);

 标准规定:

        str1大于str2的情况,结果返回一个>0的值;

        str1等于str2的情况,结果返回一个=0的值;

        str1小于str2的情况,结果返回一个<0的值。

比较方法:逐个字符,按照ASCⅡ的值进行比较 ,直到结果相等或num=0; 

2.3.1模拟实现
 
2.3.2结果展示 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/2889698.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-14
下一篇 2022-09-14

发表评论

登录后才能评论

评论列表(0条)

保存