目录
1.字符分类函数
使用字符分类函数需要包含头文件<ctype.h>
字符串分类函数有很多种,我就着重介绍其中两个(其他的也都类似):
1.isupper函数 2.islower函数
1.1 isupper函数
int isupper(int c);
isupper函数作用是判断字符是否为大写,并返回值说明。
当该字符为大写,则返回非0值。若不是大写,则返回0。
#include<stdio.h>
#include<ctype.h>
int main()
{
int ret1 = isupper('a');//判断字符'a'是否大写
int ret2 = isupper('A');//判断字符'A'是否大写
printf("isupper('a')=%d \nisupper('A')=%d\n",ret1,ret2);
return 0;
}
1.2islower函数
int islower(int c);
islower函数作用是判断字符是否为小写,并返回值说明。
当该字符为小写,则返回非0值。若不是小写,则返回0。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int ret1 = islower('a');//判断字符'a'是否小写
int ret2 = islower('A');//判断字符'A'是否小写
printf("islower('a')=%d \nislower('A')=%d\n", ret1, ret2);
return 0;
}
2. 字符转换函数
C语言提供了两个字符转换函数:
1.int toupper(int c);//将小写字符c转换成大写
2.int tolower(int c);//将大写字符c转换成小写
使用案例:
#include<stdio.h>
#include<ctype.h>
int main()
{
char str1[] = "i am a student";
char* s1 = str1;
char str2[] = "I AM A STUDENT";
char* s2 = str2;
//将小写字符串str1转换成大写
while (*s1)
{
if (islower(*s1))
*s1=toupper(*s1);
putchar(*s1);
s1++;
}
printf("\n");
//将大写字符串str2转换成小写
while (*s2)
{
if(isupper(*s2))
*s2=tolower(*s2);
putchar(*s2);
s2++;
}
printf("\n");
return 0;
}
3.strlen的使⽤和模拟实现
size_t strlen ( const char* str );
功能:返回字符串的长度
注意:
①strlen函数使用之前要包含头文件<string.h>
②strlen函数返回的是字符串'\0'之前的字符的个数(不包含'\0')
③传入的字符串必须含有'\0'
④函数的返回值类型为size_t(易错!)
使用案例:
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "ABCDEFG";
char str2[] = "ABCD\0EFG";
size_t ret1 = strlen(str1);
size_t ret2 = strlen(str2);
printf("strlen(str1):%zd\nstrlen(str2):%zd\n", ret1, ret2);
return 0;
}
模拟实现:
strlen函数可以三种不同方式来模拟实现,分别是:1、计数器 2、递归 3、指针 - 指针
//方式一:计数器
#include<stdio.h>
size_t my_strlen(const char* str)
{
size_t count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
//方式二:递归
#include<stdio.h>
size_t my_strlen(const char* str)
{
if (*str == '\0') return 0;
return my_strlen(str+1) + 1;
}
//方式三:指针 - 指针
#include<stdio.h>
size_t my_strlen(const char* str)
{
char* left = str;//定义指针指向字符串首地址
while (*str)
str++;
char* right = str;//定义指针指向字符串尾地址
size_t ret = right-left;//指针-指针的值为两个指针之间元素的个数
return ret;
}
4.strcpy的使⽤和模拟实现
char* strcpy (char * destination, const char * source );
功能:strcpy函数能将源字符串(右参数)的内容拷贝到目标空间(左参数)中。
注意:
①需要包含头文件<string.h>
②源字符串必须以‘\0’结尾
③目标空间必须足够大,以确保能够放入源字符串
④目标空间必须可修改
⑤源字符串的‘\0’也要拷贝到目标空间(注意!)
使用案例:
#include<stdio.h>
#include<string.h>
int main()
{
char Destination[20] = "xxxxxxxx";//目标空间
char Source[] = "ABCDEFG";//源字符串
printf("%s\n", Destination);
strcpy(Destination, Source);
printf("%s\n", Destination);
return 0;
}
模拟实现:
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest++ = *src++)
{
}
return ret;
}
5.strcat的使⽤和模拟实现
char *strcat (char *destination , const char *source);
功能:把源字符串拼接在目标空间后面。
注意:
①需要包含头文件<string.h>
②源字符串必须以‘\0’结尾
③目标空间也要有‘\0’,否则不知道往哪追加
④目标空间必须足够大,以确保能够容纳源字符串
⑤目标空间必须可修改
使用案例:
#include<stdio.h>
#include<string.h>
int main()
{
char Destination[20] = "xxxxxxxx";
char Source[] = "ABCDEFG";
printf("%s\n", Destination);
strcat(Destination, Source);
printf("%s\n", Destination);
return 0;
}
模拟实现:
#include<assert.h>
#include<stdio.h>
#include<string.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char* ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
}
return ret;
}
6. strcmp的使⽤和模拟实现
int strcmp (const char * str1, const char * str2)
功能:strcmp函数会将str1与str2从头到尾逐个字符进行字符大小(ASCII码)的比较,若两个字符相同则跳过,直到找到第一个不同的字符进行比较并返回值说明。
注意:如果两个字符串完全相同,则返回值为0。
标准规定:
①第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
②第⼀个字符串等于第⼆个字符串,则返回0
③第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
使用案例:
#include<stdio.h>
#include<string.h>
int main()
{
//相同字符串比较
char str1[] = "ABCDEFG";
char str2[] = "ABCDEFG";
int ret1 = strcmp(str1,str2);
printf("%d\n", ret1);
//当字符串1小于字符串2
char str3[] = "AAAAAAA";
char str4[] = "ABCDEFG";
int ret2 = strcmp(str3, str4);
printf("%d\n", ret2);
//当字符串1大于字符串2
char str5[] = "ABCDEFG";
char str6[] = "AAAAAAA";
int ret3 = strcmp(str5, str6);
printf("%d\n", ret3);
return 0;
}
模拟实现:
#include<assert.h>
#include<stdio.h>
#include<string.h>
int my_strcmp(char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1== *str2&&*str1&&*str2)
{
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else if (*str1 < *str2)
return -1;
else return 0;
}
7. strncpy函数的使⽤
char * strncpy ( char * destination, const char * source, size_t num );
功能:将字符串source中前num个字符拷贝到字符串destination中。
注意:如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。
使用案例:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "xxxxx";
char arr2[] = "I am a student";
strncpy(arr1, arr2, 10);
printf("%s\n", arr1);
return 0;
}
8. strncat函数的使⽤
char * strncat ( char * destination, const char * source, size_t num );
功能:将字符串source的前num个字符拷贝到字符串destination后边再追加一个‘\0’字符。
注意:如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "xxxxx";
char arr2[] = "I am a student";
strncat(arr1, arr2, 10);
printf("%s\n", arr1);
return 0;
}
9. strncmp函数的使⽤
int strncmp ( const char * str1, const char * str2, size_t num );
功能:⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。(返回值规则与strcmp一样)
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "ABCDE";
char arr2[] = "ABCDEFG";
int ret1 = strncmp(arr1, arr2,5);
printf("%d\n", ret1);
int ret2 = strncmp(arr1, arr2, 6);
printf("%d\n", ret2);
return 0;
}
10. strstr的使⽤和模拟实现
char * strstr ( const char * str1, const char * str2);
功能:在str1中查找str2,并返回第一次出现str2的位置。
注意:字符串的比较不包含‘\0’,以'\0'作为结束标志。
使用案例:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "xxxABCDxxxx";
char arr2[] = "ABCD";
char* ret = strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
模拟实现:
要模拟实现strstr函数,得考虑三种情况:
①str1中直接含有str2,例如:str1:xxxABC str2:ABC
②str1中含有str2,但是在查找到str2之前有干扰项,例如:str1:AAABC str2:ABC
③str1中不含有str2,此时直接返回NULL
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
char* cur = str1;
while (*cur)
{
//重置指针s1与s2的位置
char* s1 = cur;
char* s2 = str2;
//若找到str2第一个字符,则接着找,直到字符不同
while (*s1 == *s2&&*s2&&*s1)
{
s1++;
s2++;
}
//若*s2为0,则说明str1中包含str2,返回地址cur
if (*s2 == '\0')
return cur;
cur++;
}
//退出循环,说明str1中不包含str2,返回空
return NULL;
}
11. strtok函数的使⽤
char * strtok ( char * str, const char * sep);
功能:用标记分割字符串
例如:str为:"ABC@DEF#123456",sep为:@#
则函数可将其分割为ABC DEF 123456
注意:
①
sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合
②
第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
③
strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向该段字符串的指针。 例如:str:[email protected] sep:@. 调用一次函数str结果为:A\0B.C 调用两次:A\0B\0C (注:strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。)④
若strtok第一个参数不为NULL,则函数将找到str的第一个标记(将它改为\0),并保存该标记的位置。
⑤
若strtok第一个参数为NULL时,函数将从上次保存的位置开始往后找下一个标记(将其改为\0),并保存该标记位置以确保下次从此开始。
⑥如果字符串中不存在更多标记,则返回NULL。
使用案例:
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "[email protected]";
char sep[] = "@.";
char* ret = strtok(str, sep);
printf("%s\n", ret);
ret = strtok(NULL, sep);
printf("%s\n", ret);
ret = strtok(NULL, sep);
printf("%s\n", ret);
//当后面没有标记时
ret = strtok(NULL, sep);
printf("%s\n", ret);
return 0;
}
12. strerror函数的使⽤
功能:返回错误信息的地址。 当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中。 而在 strerror传入错误码,它就会返回这个错误码对应的错误信息。 例如:char * strerror ( int errnum );
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
for (int i = 0; i <= 10; i++)
printf("%s\n", strerror(i));
return 0;
}
使用案例:
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE* pFile;
pFile = fopen("hehe.txt", "r");
if (pFile == NULL)
printf("Error opening file hehe.txt: %s\n", strerror(errno));
return 0;
}
END
标签:字符,函数,int,str2,str1,char,字符串,include
From: https://blog.csdn.net/NoobNo2/article/details/136816929