十、字符函数和字符串函数
1.字符分类函数
C语言提供了专门用来字符分类的函数。使用时需要包含头文件<ctype.h>。
| iscntrl | 任何控制字符 |
| isspace | 空白字符:空格' '、换页'\\f'、换行'\\n'、回车'\\r'、制表符'\\t'或者垂直制表符'\\v' |
| isdigit | 十进制数字 |
| isxdigit | 十六进制数字 |
| islower | 小写字母a~z |
| isupper | 大写字母A~Z |
| isalpha | 字母a~z或A~Z |
| isalnum | 字母或数字 |
| ispunct | 标点符号,任何不属于数字或字母的图形字符(可打印) |
| isgraph | 任何图形字符 |
| isprint | 任何可打印字符,包括图形字符和空白字符 |
2.字符转换函数
C语言还提供了2个字符转换函数:
int tolower (int c);//将大写字母转成小写字母
int toupper (int c);//将小写字母转成大写字母
3.strlen的使用和模拟实现
(一)strlen函数:计算字符串长度
语法形式:
size_t strlen (const char* str);
*字符串,以'\\0'作为结束标志, strlen函数返回的是在字符串中'\\0'前面出现的字符个数,不包含'\\0'。
*参数指向的字符串必须要以'\\0'结束,返回值为size_t是无符号的,strlen的使用需要包含头文件<string.h>。
(二)strlen函数模拟实现
//计数器
int my_strlen(const char* p)
{
assert(p);
int count=0;
while(*p)
{
count++;
p++;
}
return count;
}
//递归
int my_strlen(const char* p)
{
assert(p);
if(*p=='\\0')
return 0;
else
return 1+my_strlen(p+1);
}
//指针-指针
int my_strlen(const char* p)
{
assert(p);
char *p1=p;
while(*p)
p++;
return p-p1;
}
4.strcpy的使用和模拟实现
(一)strcpy函数:将一个字符串复制到另一个字符串中。
语法形式:
char *strcpy(char *dest,const char *src);
*源字符串必须以'\\0'结束,拷贝时源字符串中的'\\0'也要拷贝过去。
*目标空间必须可以修改并且足够大,确保字符串顺利拷贝。
*使用时需要包含头文件<string.h>。
(二)strcpy函数模拟实现
#include <stdio.h>
#include <assert.h>
char *my_strcpy(char *dest,const char*src)
{
assert(dest&&src);
char *ret=dest;
while(*dest++==*src++)
;
return ret;
}
int main()
{
char str1[]="abcdef";
char str2[20];
char *str=my_strcpy(str1,str2);
printf("%s\\n",str1);
printf("%s\\n",str);
return 0;
}
5.strcat的使用和模拟实现
(一)strcat函数:将一个字符串连接到另一个字符串的末尾。
语法形式:
char *strcat(char *dest,const char *src);
*源字符串必须以'\\0'结束,目标字符串也必须包含'\\0',否则追加时候不知道从哪里起始和结束。
*目标空间必须可以修改并且足够大,确保字符串顺利追加。
(二)strcat函数模拟实现
#include <stdio.h>
#include <assert.h>
char *my_strcat(char *dest,const char *src)
{
assert(dest&&src);
char *ret=dest;
while(*dest)
dest++;
while(*dest++=*src++)
;
return ret;
}
int main()
{
char str1[20]="abcdef";
char str2[]="ghijklmn";
char *str=my_strcat(str1,str2);
printf("%s\\n",str1);
printf("%s\\n",str);
return 0;
}
*该代码无法实现字符串追加本身。
6.strcmp的使用和模拟实现
(一)strcmp函数:字符串比较函数
语法形式:
int strcmp(const char *str1,const char *str2);
*字符串要以'\\0'结束,两个字符串进行按位比较对应的ASCII值,str1大于str2,返回大于0的数字;str1等于str2,返回0;str1小于str2,返回小于0的数字。
*使用时需要包含头文件<string.h>。
(二)strcmp函数模拟实现
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char *str1,const char *str2)
{
assert(str1&&str2);
while(*str1==*str2)
{
if(*str1=='\\0')
return 0;
str1++;
str2++;
}
return *str1-*str2;
}
int main()
{
char str1[]="abcdef";
char str2[]="abbcc";
int ret=my_strcmp(str1,str2);
printf("%d\\n",ret);
return 0;
}
7.strncpy的使用
strncpy函数:从源字符串中拷贝指定数量的字符到目标字符串。
语法形式:
char *strncpy(char *dest,const char *src,size_t n);
*n是指定拷贝字符数,如果源字符串长度小于n,目标字符串将用‘\\0’填充至n个字符。如果源字符串的长度大于n,目标字符串可能不会以'\\0'结尾。
8.strncat的使用
strncat函数:将源字符串的前n个字符追加到目标字符串的末尾。
语法形式:
char *strncat(char *dest,const char *src,size_t n);
*函数会自动在追加的字符后添加终止符'\\0'。
*如果源字符串的长度小于n,只会将源字符串中到'\\0'的内容追加到目标字符串末尾。
9.strncmp的使用
strncmp函数:比较两个字符串的前n个字符。
语法形式:
int strncmp(const char *str1,const char *str2,size_t n);
*比较在遇到空字符或比较完n个字符为止。
*str1小于str2,返回小于0的值;str1等于str2,返回0;str1大于str2,返回大于0的值。
10.strstr的使用和模拟实现
(一) strstr函数:查找子字符串在字符串中的首次出现位置。
语法形式:
char *strstr(const char *str1,const char *str2);
*如果找到子字符串,返回指向首次出现位置的指针。如果未找到,返回NULL。
(二)strstr函数模拟实现
#include <stdio.h>
char* my_strstr(const char* str1,const char* str2)
{
char* s1=NULL;
char* s2=NULL;
char* cur=str1;
while(*cur)
{
s1=cur;
s2=str2;
while(*s1==*s2&&*s1!='\\0'&&*s2!='\\0')
{
s1++;
s2++;
}
if(*s2=='\\0')
return cur;
cur++;
}
return NULL;
}
int main()
{
char arr1[]="abbbcdef";
char arr2[]="bbcde";
char* ret=my_strstr(arr1,arr2);
if(ret!=NULL)
printf("%s\\n",ret);
else
printf("没找到\\n");
return 0;
}
11.strtok的使用
strtok函数:字符串分割函数,用于将字符串按指定的分割符拆分为多个子字符串。
语法形式:
char *strtok(char *str,const char *sep);
*str待分割的字符串在首次调用时传入,后续调用传入NULL。strtok函数会返回下一个子字符串的指针,如果没有更多的字符串,返回NULL。
*strtok函数找到str中的下一个标记,并用'\\0'结尾。strtok函数会改变待切分的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容,并且可以修改。
12.strerror的使用
strerror函数:将错误码转换为可读的错误信息字符串。
语法形式:
char *strerror(int errnum);
errnum:错误码。(通常为errno的值)
在不同的系统和C语言标准库的实现中,都规定了一些错误码,一般是放在这个<errno.h>头文件中说明的。C语言程序启动的时候就会使用一个全局变量errno来记录程序当前的错误码,只不过程序启动时错误码为0,表示没有错误。在使用标准库中的函数发生了某种错误,就会将对应的错误码放在这个变量中。而一个错误码的数字是整数,很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。这个函数就可以将对应的错误信息字符串的地址返回。
*perror函数通常和错误码结合使用,perror可以根据errno的值,输出对应的错误描述信息。当perror的参数是一个自定义字符串时,会作为错误信息的前缀输出(再加上一个冒号和一个空格);如果参数是空指针,则进输出错误描述。
网硕互联帮助中心





评论前必须登录!
注册