一、字符串相关函数
1.字符分类函数
(1)概念和作用
a.用于字符分类
b.使用前需包含头文件<ctype.h>
c.参数符合条件返回为真
(2)部分函数
isupper( ) 、islower( ):检测英文字符的大小写
2.字符转换函数
(1)概念和作用
a.用于转换英文字符的大小写
b.使用前需包含头文件<ctype.h>
c.配合putchar ( ) 实现改变原字符(并打印)
(2)使用
#include<stdio.h>
#include<ctype.h>
int main()
{
int i = 0;
char str[] = "Test String.\n";
char c;
while (str[i])
{
c = str[i];
if (islower(c))
c = toupper(c);
putchar(c);
i++;
}
return 0;
}
二、字符串函数
1.strlen的使用和模拟实现
(1)使用
strlen(str):获取字符串长度
a.传入的字符串必须以 \0 结尾,并统计 \0 前的字符个数
char str[] = { "abcd" };
char str[] = { 'a','b','c','d','\0' };
//注意不要遗漏第二种写法的\0;
b,.使用需要包含头文件<string.h>
c.该函数的返回值是 size_t 类型
(2)模拟实现
计数器法
size_t my_strlen(const char* s)
{
int count = 0;
while (*s != '\0')
{
count++;
s++;
}
return count;
}
指针相减法
size_t my_strlen(char* s)
{
char* p = s;
while (*p != '\0')
{
p++;
}
return p - s;
}
递归法
size_t my_strlen(char* s)
{
if (*s == '\0')
return 0;
else
return 1 + my_strlen(s + 1);
}
2. strcpy的使用和模拟实现
(1)使用
strcpy(str1,str2):将arr2的元素复制粘贴至arr1
a.arr1必须是可修改且大于arr2的空间
b.arr2必须以 \0 结尾、
c.\0 也会被一并复制
(2)模拟实现
char* My_strcpy(char* s1,const char* s2)
{
char* ret = s1;
while (*s1++ = *s2++)
{
;
}
return ret;
}
3.strcat的使用和模拟实现
(1)使用
strcat(str1,str2):将 arr2 追加在 arr1 后
a.源字符串和目标字符串以 ‘\0’ 结束
b.目标字符串必须有足够的空间
c.目标字符串可以修改
d.源字符串和目标字符串不能相同
(2)模拟实现
void My_strcat(char* s1, char* s2)
{
char* spot = s1;
while (*spot)
{
spot++;
}
while (*spot++ = *s2++)
{
;
}
return 0;
}
4.strcmp的使用和模拟实现
(1)使用
strcmp(str1,str2):将arr1与arr2比较(字符的ASCII码值)
a.第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
b.第⼀个字符串等于第⼆个字符串,则返回0
c.第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
(2)模拟实现
int My_strcmp(const char* s1,const char* s2)
{
while (*s1 == *s2)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
if (*s1 - *s2 > 0)
return 1;
else
return -1;
}
5.strncpy、strncat、strncmp函数
不同点——在原有的基础上,限制了长度。
(1)strncpy(str1,str2,int)
a.从 str2 中拷贝 n 个字符至 str1 中
b.n 大于 str2 中的元素个数,将追加 0 至达到 n
(2)strncat(str1,str2,int)
a.将 str2 的前 n 个字符追加至 str1 末尾,再追加一个 \0
b.str2 的长度小于 n 时,会追加 str2 全部内容并补充 \0 ,直到达到 n
(3)strncmp(str1,str2,int)
限制比较的字符数,最多到第 n 个字符。
6.strstr的使用和模拟实现
(1)使用
strstr(str1,str2):返回 str2 在 str1 中第一次出现的位置(即指针)
a.字符串的比较配对不包含 \0 ,以 \0 作为结束标志
b.不存在时,返回空指针(NULL)
(2)模拟实现
char* My_strstr(const char* str1,const char* str2)
{
const char* spot = (char*)str1;
const char* s1 = NULL;
const char* s2 = NULL;
if (*str2 == '\0')
return (char*)str1;
while (*spot)
{
s1 = spot;
s2 = str2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
return (char*)spot;
spot++;
}
return NULL;
}
7.strtok的使用和模拟实现
(*)使用
strtok(str1,const str2):根据str2中的元素将str1切割
a.str2是一个包含分割符的字符串
b.str1是一个含有 0 或多个分隔符的字符串
c.strtok函数会找到str1中的下一个分隔符,并用 \0 替换,且返回一个指向此处的指针(此函数会改变原字符串,一般将目标字符串临时拷贝一份作为str1)
d.str1不为 NULL,函数将找到str1中的第一个分隔符,并保存它在 str1 中的位置;str1为 NULL,函数将从上次保存的位置开始寻找下一个分隔符
e.不存在更多的分隔符,将返回 NULL
使用举例(一般配合 for循环使用)
char str[] = { "A111B222C333D444" };
char* p = { "ABCD" };
char* s = NULL;
for (s = strtok(str, p); s != NULL; s = strtok(NULL, p))
{
printf("%s\n", s);
}
8.strerror的使用和模拟实现
(*)使用
strerror( int ):传入一个错误码,返回错误对应的字符串地址
a.使用前声明头文件 <string.h>
b.使用错误码需声明头文件<errno.h>
使用举例
int main()
{
int i = 0;
for (i = 0; i <= 10; i++)
{
printf("%s\n", strerror(i));
}
return 0;
}