目录
一、字符分类函数
在头文件<ctype.h>里有一系列函数是用来字符分类的,使用其中的,若字符符合条件便返回真
iscntrl | 控制字符 |
isspace | 空白字符:空格,换页符,换行符,回车,制表服或垂直制表符 |
isdigit | 十进制数字 |
isxdigit | 十六进制数字 |
islower | 小写字母 |
isupper | 大写字母 |
isalpha | 字母 |
isalnum | 字母或数字 |
ispunct | 标点符号,任何不属于数字或字母的图形字符 |
isgraph | 图形字符 |
isprint | 任何可打印字符 |
例:将一个字符串的小写改为大写
#include <stdio.h>
#include <ctype.h>
int main()
{
char a[] = "I am a Student\n";
for (int i = 0; a[i] != '\0'; i++)
{
if (islower(a[i]))
a[i] -= 32;//小写字符的ascll码值减32改为大写字符
printf("%c", a[i]);
}
return 0;
}
运行结果:
二、字符转换函数
tolower | 将参数传进去的大写字母转小写 |
toupper | 将参数传进去的小写字母转大写 |
例:
#include <stdio.h>
#include <ctype.h>
int main()
{
char a[] = "I am a Student\n";
char b[] = "I am a Student\n";
for (int i = 0; a[i] != '\0'; i++)
{
if (islower(a[i]))
a[i] -= 32;//小写字符的ascll码值减32改为大写字符
printf("%c", a[i]);
}
printf("\n");
for (int i = 0; b[i] != '\0'; i++)
{
if (islower(b[i]))
b[i] = toupper(b[i]);
printf("%c", b[i]);
}
return 0;
}
运行结果:
三、字符串函数
1、strlen
字符串以 ' \0 ' 作为将结束标志,strlen会返回在 ' \0 ' 之前的字符个数,但不包括 ' \0 '
size_t strlen ( const char * 字符串地址 );
1)使用
char a[] = "I am a Student";
int num = strlen(a);
printf("%d", num);
运行结果 :
2)模拟
#include<stdio.h>
#include<assert.h>
//遍历
size_t strlen_copy1(const char* p)
{
assert(p != NULL);
int n = 0;
while (*p != '\0')
{
p++;
n++;
}
return n;
}
//指数相减
size_t strlen_copy2(const char* p1)
{
assert(p1 != NULL);
const char* p2 = p1;
while (*p2 != '\0')
{
p2++;
}
return p2 - p1;
}
//递归
size_t strlen_copy3(const char* p)
{
assert(p != NULL);
if (*p != '\0')
return 1 + strlen_copy3(p + 1);
else
return 0;
}
int main()
{
const char* a = "I am a student";
printf("strlen_copy1: %zd \n", strlen_copy1(a));
printf("strlen_copy2: %zd \n", strlen_copy2(a));
printf("strlen_copy3: %zd \n", strlen_copy3(a));
return 0;
}
运行结果:
2、strcpy
该函数可以将源字符串包括 ' \0 ' 全部拷贝到另一个字符串当中
char* strcpy(char * 目标地址, const char * 源字符串地址 );
1) 使用
#include <stdio.h>
#include<string.h>
int main()
{
char a[] = "I am a Student";
char b[200] = { 0 };
strcpy(b, a);
printf("%s", b);
return 0;
}
运行结果:
2) 模拟
#include<stdio.h>
#include<assert.h>
char* strcpy_copy(char* target_p, const char* start_p)
{
assert(start_p != NULL);
assert(target_p != NULL);
char* target_p_copy = target_p;
while (*start_p != '\0')
{
*target_p = *start_p;
target_p++;
start_p++;
}
*target_p = *start_p;
return target_p_copy;
}
int main()
{
char a[] = "I am a student";
char a_copy[200] = { 0 };
strcpy_copy(a_copy,a);
printf("a: %s \n", a);
printf("a_copy: %s \n", a_copy);
return 0;
}
运行结果 :
3、strcat
该函数可以将源字符串从目标字符串末尾开始合并
char *my_strcat(char *目标地址, const char*源字符串地址)
1)使用
#include <stdio.h>
#include<string.h>
int main()
{
char a[200] = "I am a ";
char b[] = "Student";
strcat(a, b);
printf("%s", a);
return 0;
}
运行结果:
2)模拟
#include<stdio.h>
#include<assert.h>
char* strcat_copy(char* destination, const char* source)
{
assert(source != NULL);
char* dest = destination;
while (*destination != '\0')
destination++;
while (*destination++ = *source++);
*destination = *source;
return dest;
}
int main()
{
char a[100] = "I am a ";
char b[] = "student";
printf("%s\n", strcat_copy(a, b));
return 0;
}
运行结果:
4、strcmp
该函数可以比较字符串大小,比较方法是将两个字符串的每一个同一位置上的字符的ASCLL码值比较,若大于返回大于0的数字,等于返回,小于返回小于0的数字
int my_strcmp (const char * 被比较字符串, const char * 比较字符串)
1)使用
#include <stdio.h>
#include<string.h>
int main()
{
char a[200] = "I am a Student";
char b[] = "I am a sTudent";
printf("%d", strcmp(a,b));
return 0;
}
运行结果:
2)模拟
#include<stdio.h>
#include<assert.h>
int strcmp_copy(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
const char* str1 = "abcdef";
const char* str2 = "abcdef";
const char* str3 = "abcde";
const char* str4 = "abcdef";
const char* str5 = "abcdef";
const char* str6 = "abcde";
printf("str1 str2: %d\n", strcmp_copy(str1,str2));
printf("str3 str4: %d\n", strcmp_copy(str3, str4));
printf("str5 str6: %d\n", strcmp_copy(str5, str6));
return 0;
}
运行结果:
5、strncpy
与strcpy的区别是它不会在目标字符串后面追加 ' \0 ' ,且它可以指定复制多少个字符,如果复制的字符多于源字符串字符数的话,会在后面用0作补充。
char* strncpy_copy(char* 目标字符串,const char* 源字符串,size_t 复制的字符个数)
1)使用
#include <stdio.h>
#include<string.h>
int main()
{
char a[] = "abcdef";
char b[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
printf("%s\n", strncpy(b,a,4));
printf("%s\n", strncpy(b, a,10));
return 0;
}
运行结果:
2)模拟
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* strncpy_copy(char* dest,const char* sour,size_t num)
{
assert(dest && sour);
char* dest_copy = dest;
size_t len = strlen(sour);
for (size_t i = 0; i < num; i++)
{
if (i < len)
{
*(dest + i) = *(sour + i);
}
else
{
*(dest + i) = 0;
}
}
return dest_copy;
}
int main()
{
const char* a = "abcdef";
char b[50] = "xxxxxxxxxxxxxxxxxxxxxxxxx";
char c[50] = "xxxxxxxxxxxxxxxxxxxxxxxxx";
strncpy_copy(b, a, 10);
printf("%s\n", b);
strncpy_copy(c, a, 4);
printf("%s\n", c);
return 0;
}
运行结果:
6、strncat
与strcat的区别是可以将指定字符个数最加到目标字符串末尾,并且追加 ' \0 ' 。但是,如果源字符串字符个数不够,那么只会把源字符串追加完
1)使用
#include <stdio.h>
#include<string.h>
int main()
{
char a[20] = "I am a ";
char b[] = "Studentxxxxxxxxxxxxxxxxxxxxxxxxx";
strncat(a, b, 7);
printf("%s", a);
return 0;
}
运行结果:
7、strncmp
与strcpm的区别是可以比较指定个数的字符
8、strstr
寻找源字符串在目标字符串第一次出现的位置,找不到返回0
char * strstr ( const char * 目标字符串, const char * 源字符串);
1)使用
#include <stdio.h>
#include<string.h>
int main()
{
char a[] = "abbbbcdef";
char b[] = "bbc";
printf("%s", strstr(a, b));
return 0;
}
运行结果:
2)模拟
#include<stdio.h>
typedef const char* cc;
cc strstr_copy(cc str1, cc str2)
{
while (*str1 != '\0')
{
cc cpy1 = str1;
cc cpy2 = str2;
while (*cpy2 != '\0')
{
if (*cpy1 == *cpy2)
{
cpy1++;
cpy2++;
}
else
{
break;
}
}
if (*cpy2 == '\0')
{
return str1;
}
str1++;
}
return 0;
}
int main()
{
cc a = "abbbcdef";
cc b = "bbc";
cc c = "ccc";
cc ret1 = strstr_copy(a,b);
printf("%s\n", ret1);
cc ret2 = strstr_copy(a, c);
printf("%s\n", ret2);
return 0;
}
运行结果:
9、strtok
char * strtok ( char * str, const char * sep);
sep | 指向⼀个字符串,定义了⽤作分隔符的字符集合 |
str | 指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记 |
strtok函数找到str中的下⼀个标记,并将其用 ' \0 ' 结尾,返回⼀个指向这个标记的指针。
1)使用
第⼀个参数不为NULL,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。
第⼀个参数为NULL函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记
如果字符串中不存在更多的标记,则返回NULL指针。
#include <stdio.h>
#include<string.h>
int main()
{
char a[] = "157576986@193.com";
char b[] = "@.";
printf("%s\n",strtok(a,b));
printf("%s\n", strtok(NULL, b));
printf("%s\n", strtok(NULL, b));
return 0;
}
运行结果: