目录
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结果展示
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)