求字符串长度
strlen
size_t strlen( const char *string );
该函数用于计算一个字符串的长度,接收字符指针,返回字符串长度的无符号整型。
该函数原理是在字符串中查找'\0',会读取字符串的内容。
注意:
1、参数指向的字符串必须以'\0'结尾。
2、返回的类型是无符号整型,且是'\0'之前的元素个数。
int main()
{
char arr[] = "abcde";
printf("%d", strlen(arr));
SYS;
R0;
}
// 这段代码中返回的是5
int main()
{
char a1[] = "abcd";
char a2[] = "abcdef";
if (strlen(a1) - strlen(a2) > 0)
{
printf("str1>str2\n");
}
else
{
printf("str1<str2\n");
}
SYS;
R0;
}
这段代码中,str1的元素个数为4,str2的元素个数为6,4-6=-2,但代码执行结果为str1>str2,是因为strlen返回的是无符号整型 。
unsigned 4- unsigned 6=unsigned 4294967294。
模拟实现
strlen模拟实现一般有三种方法
1、计数器
size_t my_strlen(const char* str)
{
int count = 0;
while (*str != 0)
{
str++;
count++;
}
return count;
}
int main()
{
char a[] = "abcdef";
printf("%d", my_strlen(a));
SYS;
R0;
}
2、递归
size_t my_strlen(const char* str)
{
if (*str == '\0')
{
return 0;
}
else
{
return my_strlen(str + 1) + 1;
}
}
int main()
{
char a[] = "abcdef";
printf("%d", my_strlen(a));
SYS;
R0;
}
3、指针
size_t my_strlen(const char* str)
{
char *end = str;
while (*end)
{
end++;
};
return end - str;
}
int main()
{
char a[] = "abcdef";
printf("%d", my_strlen(a));
SYS;
R0;
}
长度不受限制的字符串函数
strcpy
char *strcpy( char *strDestination, const char *strSource );
该函数字符串复制函数,需要一个源字符串与一个目标字符串作为参数,返回目标字符串的首地址。
注意:
1、该函数的源字符串和目标字符串都必须以'\0'结尾。
2、该函数目标字符串空间必须大于等于源字符串空间,如果小于,那么该函数也会进行复制,造成数组越界。
3、该函数的目标空间必须可变。
模拟实现
char *my_strcpy(char *b, const char *a)
{
char *ret = b;
while (*b++ = *a++);
return ret;
}
int main()
{
char a[] = "abcdefg";
char b[50];
my_strcpy(b, a);
printf("%s", b);
SYS;
R0;
}
strcat
char *strcat( char *strDestination, const char *strSource );
该函数将两个字符串拼接在一起,并返回目标字符串。
注意:
1、目标字符串必须够大。
2、源字符串必须以'\0'结尾,因为该函数会不断向后,直到找到'\0'。
3、目标空间可修改。
4、该字符串不可给自己追加,该函数要找到目标的'\0'字符处进行追加,自己给自己追加会丢失'\0'字符。
模拟实现
char * my_strcat(char *b, const char *a)
{
char *ret = b;
while (*b)
{
b++;
}
while (*b++ = *a++);
return ret;
}
int main()
{
char a[] = "abcdefg";
char b[50] = "XXXX";
my_strcat(b,a);
printf("%s\n", b);
SYS;
R0;
}
strcmp
int strcmp( const char *string1, const char *string2 );
通过比较两个字符串中字符的大小,判断字符串的大小,当str1>str2时返回大于0的数,当str1=str2时返回0,当str1<str2时返回小于0的数。
模拟实现
int my_strcmp(const char* b, const char *a)
{
while (*b - *a == 0 && *b&&*a)
{
b++;
a++;
}
return *b - *a;
}
int main()
{
char a[] = "abcde";
char b[] = "abcdef";
int ret = my_strcmp(b, a);
if (ret > 0)
{
printf("b>a");
}
else if (ret < 0)
{
printf("b<a");
}
else
{
printf("b=a");
}
SYS;
R0;
}
长度受限制的字符串函数
strncpy
char *strncpy( char *strDest, const char *strSource, size_t count );
模拟实现
strncat
模拟实现
strncmp
模拟实现
字符串查找
strstr
char *strstr( const char *string, const char *strCharSet );
该函数在字符串中查找一个子串。
模拟实现
char *my_strstr(const char *a, const char *b)
{
assert(a&&b);
char*s1 = a;
char*s2 = b;
char *p = a;
while (*p)
{
s1 = p;
s2 = b;
while (*s1 == *s2&&*s1!='\0'&&*s2!='\0')
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return p;
}
p++;
}
return NULL;
}
int main()
{
char a[] = "abbbcdef";
char b[] = "bbcd";
char *p;
p=my_strstr(a,b);
printf("%s", p);
SYS;
R0;
}
strtok
模拟实现
错误信息报告
strerror
模拟实现
字符操作
相关字符函数
内存操作函数
memcpy
模拟实现
void * my_memcpy(void* b, void *a, size_t num)
{
void * ret = b;
while (num--)
{
*(char *)b = *(char *)a;
(char *)b+=1;
(char *)a+=1;
}
return ret;
}
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int b[30];
my_memcpy(b, a, sizeof(a));
for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
{
printf("%d ", b[i]);
}
SYS;
R0;
}
memmove
模拟实现
void *my_memmov(void * dst, void *src, size_t num)
{
void * ret = dst;
int i = 0;
if ((char *)dst >= (char *)src)
{
i = num - 1;
while (i>=0)
{
*((char*)dst+i) = *((char*)src+i);
i--;
}
}
else
{
i = 0;
while (i < num)
{
*((char*)dst + i) = *((char*)src + i);
i++;
}
}
return ret;
}
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
my_memmov(a-2, a, 5 * sizeof(int));
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
printf("%d ", a[i]);
}
SYS;
R0;
}