详细介绍:字符函数和字符串函数(C语言详细)
1.字符分类函数
接下来所说函数在头文件<ctype.h>里面
- iscntrl 任何控制字符
- isspace 空白字符:空格' ',换页'\f',换行'\n',回车'\r',制表符'\t',垂直制表符'\v'
- isdigit 十进制数字'0'~'9'字符
- isxdigit 十六进制数字字符,包括所有十进制数字字符,小写字母a~f,大写字母A~F
- islower 小写字母a~z
- isupper 大写字母A~Z
- isalpha 小写字母+大写字母
- isalnum 字母或者数字a~z,A~Z,0~9
- ispunct 标点符号,任何不属于数字或者字母的图形字符(可打印)
- isgraph 任何图形字符
- isprint 任何可打印字符,包括图形字符和空白字符
如果函数里面的参数符合上述条件就返回真
例如islower的用法
#include
#include
int main()
{
int i = 0;
char str[] = "hello,world";
while (str[i])
{
if (islower(str[i]))
str[i] -= 32;
putchar(str[i]);
i++;
}
return 0;
}

2.字符转换函数
- tolower 将参数传进去的大写字母转小写
- toupper 将参数传进去的小写字母转大写
这样我们就可以更改上述代码
#include
#include
int main()
{
int i = 0;
char str[] = "hello,world";
while (str[i])
{
str[i] = toupper(str[i]);//使用转换函数
putchar(str[i]);
i++;
}
return 0;
}

3.字符串函数(包含头文件<string.h>)
strlen的使用
- strlen函数会返回在字符串中‘\0’之前出现的字符个数(不包含‘\0’)
- 参数指向的字符串必须以‘\0’结束
- 返回值是size_t,无符号整数
#include
#include
int main()
{
char str[] = "hello,world";
printf("%zu", strlen(str));
return 0;
}

模拟实现strlen
方式一(常规)
#include
#include
size_t my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char str[] = "hello,world";
printf("%zu", my_strlen(str));
return 0;
}
方式二(递归)
#include
#include
size_t my_strlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main()
{
char str[] = "hello,world";
printf("%zu", my_strlen(str));
return 0;
}
方式三(指针)
#include
#include
size_t my_strlen(const char* str)
{
char* p = str;
while (*p != '\0')
p++;
return p - str;
}
int main()
{
char str[] = "hello,world";
printf("%zu", my_strlen(str));
return 0;
}
strcpy的使用

- strcpy函数会将源字符串复制到目标字符串
- 源字符串必须以‘\0’结束
- 会将源字符串的‘\0’拷贝到目标字符串
- 目标字符串必须足够大
- 目标字符串可以修改
- 返回值是目标字符串地址
#include
#include
int main()
{
char dest[] = "hello";
char src[] = "world";
printf("%s", strcpy(dest, src));
return 0;
}
模拟实现strcpy
#include
#include
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
int i = 0;
while (src[i] != '\0')
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';//最后手动给destkaobei'\0'
return ret;
}
int main()
{
char dest[] = "hello";
char src[] = "world";
printf("%s", my_strcpy(dest, src));
return 0;
}
优化(无需最后手动给dest拷贝‘\0’)
#include
#include
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
while (*dest++ = *src++)
{
}
return ret;
}
int main()
{
char dest[] = "hello";
char src[] = "world";
printf("%s", my_strcpy(dest, src));
return 0;
}
strcat的使用

- strcat函数会将源字符串拼接到目标字符串末尾,自动覆盖目标字符串的‘\0’,最终在拼接结果加‘\0’
- 目标字符串必须足够大
- 源字符串和目标字符串均以‘\0’结束
- 目标字符串可以修改
- 两个字符串不能重叠
- 返回值是目标字符串的首地址
#include#include int main() { char dest[20] = "hello,"; char src[] = "world"; printf("%s", strcat(dest, src)); return 0; } 模拟实现strcat
#include
#include
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
while (*dest != '\0')//找到dest为\0的位置
{
dest++;
}
while (*src != '\0')//给dest追加src
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return ret;
}
int main()
{
char dest[20] = "hello,";
char src[] = "world";
printf("%s", my_strcat(dest, src));
return 0;
}
strcmp的使用

- strcmp可以比较两个字符串(基于ASCII码)
- 从两个字符串的第一个字符开始逐个比较,直到遇到不同的字符或\0
- 字符串必须以‘\0’结束
- 返回值 >0(str1>str2);=0(str1=str2);<0(str1<str2)
#include
#include
int main()
{
char str1[] = "apple";
char str2[] = "banana";
printf("%d", strcmp(str1, str2));
return 0;
}
模拟实现strcmp
#include
#include
int my_strcmp(const char* str1, const char* str2)
{
while (str1 != '\0'&&str2 != '\0'&&(*str1 == *str2))
{
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char str1[] = "apple";
char str2[] = "banana";
printf("%d", my_strcmp(str1, str2));
return 0;
}
strncpy的使用

- strncpy可以将源字符串的最多前n个字符复制到目标字符串中(当拷贝了n个字符或者遇到了源字符串的‘\0’停止)
- 目标空间足够大
- src长度大于等于n,今复制前n个字符,不会在dest末尾补‘\0’
- src长度小于n,复制完src后剩位置补‘\0’,直到写入n个字符
- 返回值是目标字符串的其实地址
#include
#include
int main()
{
char dest[10] = "hello";
char src[] = "world";
printf("%s", strncpy(dest, src, 5));
return 0;
}
模拟实现strncpy
#include
#include
#include
char* my_strncpy(char* dest, const char* src,size_t n)
{
char* ret = dest;
assert(dest && src);
while (n > 0 && *src != '\0')
{
*dest++ = *src++;
n--;
}
while (n > 0)
{
*dest++ = '\0';
n--;
}
return ret;
}
int main()
{
char dest[20] = "hello";
char src[] = "world";
printf("%s", my_strncpy(dest, src, 5));
return 0;
}
strncat的使用

- strncat可以将源字符串的前n个字符追加到目标字符串的末尾
- 目标字符串足够大
- 会在目标字符串最后添加‘\0’
- 返回值是目标字符串的地址
#include
#include
int main()
{
char dest[20] = "hello,";
char src[] = "world";
printf("%s", strncat(dest, src, 5));
return 0;
}
模拟实现strncat
(和strcat区别不大)
#include
#include
char* my_strncat(char* dest, const char* src, size_t n)
{
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (n > 0 && *src != '\0')
{
*dest = *src;
dest++;
src++;
n--;
}
*dest = '\0';
return ret;
}
int main()
{
char dest[20] = "hello,";
char src[] = "world";
printf("%s", my_strncat(dest, src, 5));
return 0;
}
strncmp的使用

- strncmp就是在strcmp的基础上只比较两个字符串的前n个字符
- 遇到‘\0’会停止
- 返回值和strcmp一样
#include
#include
int main()
{
char str1[] = "apple";
char str2[] = "banana";
printf("%d", strncmp(str1, str2, 5));
return 0;
}
模拟实现strncmp
#include
#include
int my_strncmp(const char* str1, const char* str2, size_t n)
{
if (n == 0)
return 0;
while (n > 0&&str1 != '\0' && str2 != '\0' && (*str1 == *str2))
{
str1++;
str2++;
n--;
}
return *str1 - *str2;
}
int main()
{
char str1[] = "apple";
char str2[] = "banana";
printf("%d", my_strncmp(str1, str2, 5));
return 0;
}
strstr的使用

- strstr函数可以查找str2在str1第一次出现的位置
- 找到子字符串返回指向第一次出现位置的指针
- 如果没找到,返回NULL
- 如果子字符串是空字符串,返回str1的地址
#include
#include
int main()
{
char str1[] = "abcdeabcd";
char str2[] = "bcd";
printf("%s", strstr(str1, str2));
return 0;
}
模拟实现strstr
#include
#include
char* my_strstr(const char* str1, const char* str2)
{
char* cp = (char*)str1;//需要强制类型转换,遍历str1的字符
char* s1;//当前str1的匹配指针
char* s2;//当前str2的匹配指针
if (*str2 == '\0')
return ((char*)str1);
while (*cp != '\0')//*cp为真表示str1还未走到末尾
{
s1 = cp;//不匹配s1返回到cp的位置
s2 = (char*)str2;
while (*s1 && *s2 && (*s1 == *s2))//对s1和s2匹配
{
s1++;
s2++;
}
if (*s2 = '\0')
return cp;
cp++;
}
return (NULL);
}
int main()
{
char str1[] = "abcdeabcd";
char str2[] = "bcd";
printf("%s", my_strstr(str1, str2));
return 0;
}
strtok的使用

- strtok可以用于分割字符串
- delimiters是分隔符字符串,包含所有可能的分隔字符串
- 返回值 第一次调用:返回第一个标记的指针 后续调用:返回下一个标记的指针
- 如果没有更多标记返回
- strtok会修改原字符串,将分隔符替换成‘\0’
- 会跳过连续的分隔符
- 后续调用传NULL继续分割同一个字符串
#include
#include
int main()
{
char arr[] = "111.222.333.444";
char* sep = '.';
char* str = NULL;
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
return 0;
}

浙公网安备 33010602011771号