一、长度不受限制的字符串函数
1.strlen
1)strlen
的使用
size_t strlen ( const char * str );
//函数参数是字符串的起始地址
strlen
函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
函数的返回值为size_t,是无符号的
int main()
{
char arr[] = "abcdef";//6
//字符串结尾默认就存在'\0'
char arr[10] = { 'a','b','c','d','e','f' };//6
//数组已经设定了大小为10个元素,因此'f'后面的元素就默认为字符0,也就是'\0'
char arr[] = { 'a','b','c','d','e','f' };//随机值
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
2)证明strlen
的返回值是size_t
int main()
{
if (strlen("abc") - strlen("qwerty") > 0)//结果是>
//if ((int)strlen("abc") - (int)strlen("qwerty") > 0)//结果是<
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
3)模拟实现strlen
1.计数器的方法
#include<assert.h>
size_t my_strlen(char* str)
{
int count = 0;
assert(str != NULL);
while (*str != '\0')
{
count++;
str++;
}
return count;
2.递归的方法
int my_strlen(char* str)
{
if (*str == '\0')
{
return 0;
}
else
{
return 1 + my_strlen(str+1);
}
}
int main()
{
char str[] = "abcdefg";
printf("%d\n", my_strlen(str));
return 0;
}
2.strcpy
strcpy
- 字符串拷贝(将源字符串拷贝到目标字符串中)
char* strcpy(char* destination, const char* source);
注意:
1.源字符串必须以 ‘\0’ 结束,并并且会将源字符串中的 ‘\0’ 拷贝到目标空间。
2.目标空间必须足够大,以确保能存放源字符串;目标空间必须可变
3.strcpy
函数返回的是目标空间的起始地址。strcpy
函数的返回类型的设置是为了实现链式访问
1)strcpy
的使用
int main()
{
char arr1[] = "qwertyuiop";
char arr2[] = "def";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
2)模拟实现strcpy
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "qwertyuiop";
char arr2[] = "def";
//char* ret = my_strcpy(arr1, arr2);
//printf("%s\n",ret); 也可以写成
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
3.strcat
char* strcat(char* destination, const char* source);
注意:
1.将源字符串追加到目标字符串后面
2.源字符串必须以 ‘\0’ 结束。
3.目标空间必须有足够的大,能容纳下源字符串的内容,目标空间必须可修改
4.字符串不能自己给自己追加
1)strcat
的使用
int main()
{
char arr1[50] = "qwertyuiop";
char arr2[] = "def";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
2)模拟实现strcat
#include<assert.h>
char* my_strcat(char* dest, char* src)
{
assert(*dest && *src);
char* ret = dest;
//找到目标空间中的'\0'
while (*dest)
{
dest++;
}
//拷贝
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "qwertyuiop";
char arr2[] = "def";
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
4.strcmp
int strcmp(const char* str1, const char* str2);
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
(在vs环境下,大于0,返回的是1;小于0,返回的是-1)
注意:
strcmp
函数比较的不是字符串的长度!!!!而是比较字符串中对应位置上的字符的大小。如果相同,就比较下一对儿,直到不同或者都遇到’\0’
1)strcmp
的使用
int main()
{
char arr1[] = "qwertyuiop";
char arr2[] = "def";
int ret = strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
2)模拟实现strcmp
#include<assert.h>
int my_strcmp(const char* str1,const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;//相等
}
str1++;
str2++;
}
//不相等
if (str1 > str2)
return 1;
else
return -1;
//不相等
//return (*str1 - *str2);
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abdc";
int ret = my_strcmp(arr1,arr2);
//if (ret >0)
//{
// printf(">\n");
//}
//else if (ret == 0)
//{
// printf("== \n");
//}
//else
//{
// printf("<\n");
//}
printf("%d\n", ret);
return 0;
}
二、长度受限制的字符串函数
1.stncpy
char * strncpy ( char * destination, const char * source, size_t num );
注意:拷贝num
个字符从源字符串到目标空间。
如果源字符串的长度小于num
,则拷贝完源字符串之后,在目标的 后边追加0,直到num
个。
int main()
{
char arr1[] = "abcdef";
char arr2[] = "qwe";
strncpy(arr1, arr2, 5);//监视窗口
printf("%s\n", arr1);
return 0;
}
2.strncat
char * strncat ( char * destination, const char * source, size_t num );
如果字符串的长度小于num
,依然追加arr2
字符串的内容,不用非得是5个字符
字符串可以自己追加自己
int main()
{
char arr1[20] = "abcdef\0XXXXXXXX";
char arr2[] = "qwe";
strncat(arr1, arr2, 5);
printf("%s\n", arr1);
return 0;
}
3.strcmp
int strncmp ( const char * str1, const char * str2, size_t num );
比较num
个字符
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdq";
int ret = strncmp(arr1, arr2, 4);
printf("%d\n", ret);
return 0;
}
三、strstr
char * strstr ( const char *str1, const char * str2);
在字符串arr1
中查找是否存在arr2
这个子字符串
1.strstr
的使用
int main()
{
char arr1[] = "abcabcabcd";
char arr2[] = "abcd";
printf("%s\n", strstr(arr1, arr2));
return 0;
}
2.模拟实现strstr
#include<assert.h>
char* strstr(const char* str1,const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
while (*s1)
{
if (*s1 == *s2)
{
s1++;
s2++;
}
else
{
str1++;
s1 = str1;
s2 = str2;
}
}
if (*str1 == '\0')
{
return NULL;
}
return (char*)str1;
}
int main()
{
char arr1[] = "abcabcabcd";
char arr2[] = "cbcd";
char* ret = strstr(arr1, arr2);
if (NULL == ret)
{
printf("找不到字串\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}