文章目录
前言
一、求字符串长度:strlen
1.1 strlen函数的格式
语法格式:size_t strlen ( const char * str );
1.2 strlen函数使用小贴士
1、参数指向的字符串必须要以 ‘\0’ 结束。
2、函数的返回值为size_t,是无符号的( 易错 )。
1.3 strlen的错误代码示例
#include <stdio.h>
#include <string.h>
int main()
{
size_t len = strlen("abc") - strlen("abcdef");//3 - 6 = -3
//10000000000000000000000000000011 -3的原码
//11111111111111111111111111111100 -3的反码
//11111111111111111111111111111101 -3的补码(内存中存储的是补码,当内存以无符号类型看待时,这就是一个很大的整数)
if (len > 0)
{
printf("大于。\n");
}
else
{
printf("小于等于。\n");
}
return 0;
}
结果如下:
错误原因:strlen( )函数的返回值是size_t(无符号)类型的数字。所以当前者小于后者时,内存中存储的将是一个很大的数组。
1.4 strlen函数的正确代码示例(一)
#include <stdio.h>
#include <string.h>
int main()
{
if (strlen("abc") > strlen("abcdef"))
{
printf("大于。\n");
}
else
{
printf("小于等于。\n");
}
return 0;
}
结果如下:
1.4 strlen函数的正确代码示例(二)
#include <stdio.h>
#include <string.h>
int main()
{
if ((int)strlen("abc") - (int)strlen("abcdef") > 0)
{
printf("大于。\n");
}
else
{
printf("小于等于。\n");
}
return 0;
}
结果如下:
1.5 strlen函数的模拟实现(一)
#include <stdio.h>
size_t my_strlen(const char* str)
{
int count = 0;
while (*str++ != '\0')
{
count++;
}
return count;
}
int main()
{
size_t len = my_strlen("abcdef");
printf("%u\n", len);
return 0;
}
结果如下:
1.5 strlen函数的递归模拟实现(二)
#include <stdio.h>
size_t my_strlen(const char* str)
{
if (*str != '\0')
{
return 1 + my_strlen(++str);
}
return 0;
}
int main()
{
printf("%u\n", my_strlen("abcdef"));
return 0;
}
结果如下:
1.5 strlen函数的指针模拟实现(三)
#include <stdio.h>
#include <string.h>
size_t my_strlen(const char* str,int sz)
{
int left = 0;
int right = sz - 1;
return (str + right) - (str + left);
}
int main()
{
char ch[] = "abcdef";
int sz = strlen(ch);
my_strlen(ch, sz);
printf("%u", my_strlen(ch, sz));
return 0;
}
结果如下:
二、长度不受限制的字符串函数:strcpy
2.1 strcpy函数的格式
char* strcpy(char * destination, const char * source );
2.2 strcpy函数使用小贴士
1、源字符串必须以 ‘\0’ 结束。
2、会将源字符串中的 ‘\0’ 拷贝到目标空间。
3、目标空间必须足够大,以确保能存放源字符串。
4、目标空间必须可变
2.3 strcpy函数代码示例
#include <stdio.h>
#include <string.h>
int main()
{
char ch1[20] = { 0 };
char ch2[] = "abcdef";
strcpy(ch1, ch2);
printf("%s\n", ch1);
return 0;
}
结果如下:
2.4 strcpy函数的模拟实现
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello world";
char arr2[] = "xxxxx";
printf("%s\n",my_strcpy(arr1, arr2));
return 0;
}
结果如下:
三、长度不受限制的字符串函数:strcat
3.1 strcat函数的格式
char * strcat ( char * destination, const char * source );
3.2 strcat函数使用小贴士
1、源字符串必须以 ‘\0’ 结束。
2、目标空间必须有足够的大,能容纳下源字符串的内容。
3、目标空间必须可修改。
3.3 strcat函数代码示例
#include <stdio.h>
#include <string.h>
int main()
{
char ch1[20] = "hello ";
char ch2[] = "world";
printf("%s\n", strcat(ch1, ch2));
return 0;
}
结果如下:
3.3 strcpy 函数模拟 strcat 函数
#include <stdio.h>
#include <string.h>
int main()
{
char ch1[20] = "hello ";
char ch2[] = "world";
strcat(ch1 + 6, ch2);
printf("%s\n",ch1);
return 0;
}
结果如下:
3.4 strcat函数的模拟实现(一)
#include <stdio.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char ch1[20] = "hello ";
char ch2[] = "world";
printf("%s\n", my_strcat(ch1, ch2));
return 0;
}
结果如下:
3.4 strcat函数的模拟实现(二)
#include <stdio.h>
char* my_strcat(char* dest, const char* src)
{
char *ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char ch1[20] = "hello ";
char ch2[] = "world";
printf("%s\n", my_strcat(ch1, ch2));
return 0;
}
结果如下:
四、长度不受限制的字符串函数:strcmp
4.1 strcmp函数的格式
int strcmp ( const char * str1, const char * str2 );
4.2 strcmp函数使用小贴士
标准规定:
1、第一个字符串大于第二个字符串,则返回大于0的数字。
2、第一个字符串等于第二个字符串,则返回0。
3、第一个字符串小于第二个字符串,则返回小于0的数字。
4.3 strcat函数代码示例
结果如下:
4.4 strcmp函数的模拟实现
结果如下: