注意:所有库函数头文件都是<string.h>
1.strlen介绍:
描述
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符,这里注意一点,再用sizeof求内存大小时会计算到'\0'
声明。
下面是 strlen() 函数的声明。
参数
- str -- 要计算长度的字符串。
返回值
该函数返回字符串的长度。
模拟实现:
实现1:
计算器方法:
#include <stdio.h>
#include <assert.h>
int is_prime_values_my_strlen(char* str)
{
//断言
assert(str);
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char values[30] = { 0 };
scanf("%s", values);
int ret = is_prime_values_my_strlen(values);
printf("ret=%d\n", ret);
return 0;
}
这是用计数器的方法写,str不等于'\0'就一直加加,直到str等于'\0'时,coun里面放的就是字符串的长度
strlen求字符串长度时,是不会计算到字符'\0'的,只计算到'\0'前面的一个字符
这里多补充一点,在用sizeof求内存大小时,会把字符'\0'也计算进去
实现2:
递归求法:
#include <assert.h>
#include <stdio.h>
size_t is_prime_values_my_strlen(char* str)
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + is_prime_values_my_strlen(str + 1);
}
int main()
{
char values[] = "abcdef";
int ret=is_prime_values_my_strlen(values);
printf("ret=%d\n", ret);
}
实现3:
指针减指针写法:
#include <assert.h>
#include <stdio.h>
size_t is_prime_values_my_strlen(char* str)
{
assert(str);
char* ret = str;
char* len = str;
while (*len != '\0')
{
len++;
}
return len - ret;
}
int main()
{
char values[] = "abcdef";
int ret=is_prime_values_my_strlen(values);
printf("ret=%d\n", ret);
}
在数组里,用最高处地址的指针减去最低地址的指针,也就是指针减指针得到的就是中间元素的个数所以这里先定义ret和len最开始赋值为str,也就是首字符a的位置,在写while循环,如果len不等于'\0'就一直++,知道len等于'\0',这时len里面就放了f的地址,在return返回f减a得到字符串大小
2.strcpy介绍:
描述
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
声明
下面是 strcpy() 函数的声明。
参数
- dest -- 指向用于存储复制内容的目标数组。
- src -- 要复制的字符串。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
实现:
#include <assert.h>
#include <stdio.h>
char* is_prime_values_my_strcpy(char* dest, const char* src)
{
//断言,意思是desr和src不能为空指针
assert(dest != NULL && src != NULL);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char values1[] = "abcdef";
char values2[] = "ghi";
char* ret = is_prime_values_my_strcpy(values1, values2);
printf("ret=%s\n", ret);
return 0;
}
strcpy在拷贝时会把'\0'也拷贝过去,*de