字符串处理函数
需要加头文件 #include<string.h>
strlen 长度
- 测量从第一个元素到元素值为'\0'字符串长度
- 原型 size_t strlen(const char* str);
输入指向字符串首地址的指针 输出size_t类型的整型 表示字符串长度 - size_t类型的整型 应使用转换规范%zu(数值不大时也可以使用%d %u)
- sizeof关键词测量数组本身占用空间的大小 返回结果也是size_t类型
#include<stdio.h>
#include<string>
int main()
{
char str[20] = "hello";
size_t size=sizeof(str);
printf("sizeof=%d\n", size);//sizeof=20
size_t len = strlen(str);
printf("len=%d\n", len);//len=5
return 0;
}
strcat 拼接
- 将源字符串拼接到目标字符串后面
- 原型 char* stract(char* destination, const char* source);
输入拼接目标字符串和源字符串首地址 输出拼接目标字符串首地址 - 目标字符串后需要有足够空间 否则造成数组越界
#include<stdio.h>
#include<string>
int main()
{
char dest[9] = "ilove";
char src[4] = "you";
//拼接前
printf("%s\n", dest);//ilove
printf("%s\n", src);//you
//拼接字符串
strcat(dest, src);
//拼接后
printf("%s\n", dest);//iloveyou
printf("%s\n", src);//you
return 0;
}
strcpy 复制
- 将源字符串复制到目标字符串中 即从首元素开始覆盖目标字符串
- 原型 char* strcpy(char* destnation, char* source);
输入复制目标字符串和源字符串首地址 输出复制目标字符串首地址 - 目标字符串后需要有足够空间 否则造成数组越界
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string>
int main()
{
char dest[9] = "ilove";
char src[4] = "you";
//复制前
printf("%s\n", dest);//ilove
printf("%s\n", src);//you
//复制字符串
strcpy(dest, src);
//复制后
printf("%s\n", dest);//you
printf("%s\n", src);//you
return 0;
}
strcmp 比较
- 用于比较两个字符串
若一致则返回0
若不一致 比较ASCII码 str1>str2返回1 否则返回-1 - 原型 int strcmp(const char* str1, const char* str2);
输入两个待比较字符串首地址 输出如上
#include<stdio.h>
#include<string>
int main()
{
const char* str1 = "abc";
const char* str2 = "abcd";
const char* str3 = "ab";
//自己比自己
int ret= strcmp(str1, str1);
printf("%d\n", ret);//0
//str1比str2
ret =strcmp(str1, str2);
printf("%d\n", ret);//-1
//str1比str3
ret = strcmp(str1, str3);
printf("%d\n", ret);//1
return 0;
}
自己写字符串处理函数
为了区分系统的函数 在自己写的函数前加前缀m
strlen
size_t mstrlen(const char* str)
{
//检查输入参数的有效性 如果传入了空 直接返回0
if (str == NULL)
return 0;
//长度从0开始累计
size_t len= 0;
//计算长度
while (*str != '\0')
{
len++;
str++;
}
return len;
}
测试一下//能否处理异常和边界条件
int main()
{
size_t len;
//空指针输入
len = mstrlen(NULL);
printf("%d\n", len);//0
//空字符串输入
len = mstrlen("");
printf("%d\n", len);//0
//字符串hello输入
len = mstrlen("hello");
printf("%d\n", len);//5
return 0;
}
strcat
char* mstract(char* destination, const char* source)
{
//参数检查
if (destination == NULL)
return 0;
if (source == NULL)
return 0;
//函数返回值是目标字符串首地址 因此需要保存这个地址 将destination赋值给指针ret
char* ret = destination;
//函数是从目标字符串'\0'开始赋值的 因此先把destination指针移动到'\0'处
while (*destination != '\0')
destination++;
//遍历字符串source 将字符从destination现在的位置开始依次追究到其后
while (*source != '\0')
{
*destination = *source;
destination++;
source++;
}
//给destination结束标记'\0'
*destination = '\0';
return ret;
}
strcpy
char* mstrcpy(char* destination, char* source)
{
//参数检查
if (destination == NULL)
return 0;
if (source == NULL)
return 0;
//保存目标字符串首地址
char* ret = destination;
//依次读取source中的字符
while (*source != '\0')
{
//把source赋值给destination
*destination = *source;
destination++;
source++;
}
//给destination加结束标记
*destination = '\0';
return ret;
}
strcmp
int strcmp(const char* str1, const char* str2)
{
//检查str1和str2是否为空
if (str1 == NULL && str2 == NULL)
return 0;
if (str1 != NULL && str2 == NULL)
return 1;
if (str1 == NULL && str2 != NULL)
return -1;
int ret;
while (1)
{
//是否相等
if (*str1 != *str2)
{
//不相等
//字符比大小
if (*str1 > *str2)
ret = 1;
else
ret = -1;
break;
}
else
{
//相等
//是否同时为0
if (*str1 == '\0' && *str2 == '\0')
{
ret = 0;
break;
}
//继续比较
str1++;
str2++;
}
}
return ret;
}