承接上文:(5条消息) c语言字符串函数上:strlen、strcpy、strcat_vpurple__的博客-CSDN博客
目录
1.strcmp 字符串比较函数
1.1strcmp使用方法
1.2strcmp 模拟实现
2.长度受限制的字符串函数介绍
2.1 strncpy
2.1.1strncpy基础使用
2.1.2注意事项
2.2strncat
2.2.1strncat的基础使用
2.2.2注意事项
2.3strncmp
2.3.1注意事项
3.字符串查找
3.1strstr
3.1.1strstr的基础使用
3.1.2strstr模拟实现
3.2strtok切割字符串
3.2.1strtok的基础使用
3.2.2 注意事项
4.错误信息报告
4.1strerror
4.1.1 strerror的演示使用
4.1.2 erron
5.字符分类函数
6.字符转换函数
比较字符串内容
int strcmp(const char* str1, const char* str2);
比较两个字符串时,字符两两比较。
#include
#include
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);//保证指针有效性
while (*str1 != '\0' || *str2 != '\0')
{
if (*str1 - *str2!=0)
{
return *str1-*str2;
}
str1++;
str2++;
}
return 0;
}
int main()
{
char arr1[] = { "aihao" };
char arr2[] = { "nihao" };
if (my_strcmp(arr1, arr2) == 0)
{
printf("=\n");
}
else if (my_strcmp(arr1, arr2) > 0)
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
先复习一波长度不受限制的字符串函数 strcpy、strcat以及strcmp。
它们都执行到’\0‘。
(2条消息) c语言字符串函数上:strlen、strcpy、strcat_vpurple__的博客-CSDN博客https://blog.csdn.net/vpurple_/article/details/125873390有问题,比如strcpy目标空间的长度不够大的时候,可能会造成下图所示情况:
所以C语言提供了相对安全的长度受限制的字符串函数strncpy、strncat、strncmp。
char * strncpy ( char * destination, const char * source, size_t num );
感慨一下:现在才明确了char arr[5]中存储的字符串最多只能存除'\0'以外的4个字符,剩下一个位置是'\0',如果存储5个字符组成的字符串,加上’\0‘就是6个字符,会造成数组访问越界。
1.strncpy只拷贝num个字符从源字符串到目标空间,目标空间中的其余字符保留。
如下所示:
2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加\0,直到num个。
如下所示:
char * strncat ( char * destination, const char * source, size_t num );
1.strncat向目标空间追加规定的字符个数并在末尾补上'\0'.
如下所示:
注下两张图的arr[10]应该改为arr[]
追加之前:
追加之后:
2.如果源字符串的长度小于num,则拷贝完源字符串之后,就停止不会追加额外的\0。
如下所示:
int strncmp ( const char * str1, const char * str2, size_t num );
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
如下所示:
在一个字符串中查找字串的一个函数(在一个字符串查找另外一个字符串)。
char * strstr ( const char *str1, const char * str2);
#include
#include
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
while (*s1 != '\0')
{
if (*s1 == *s2)
{
p = s1;
while (*s1==*s2)
{
s1++;
s2++;
if (*s2 == '\0')
{
return p;
}
}
}
s1 = ++p;
s2 = str2;
}
return NULL;
}
int main()
{
char arr1[] = { "[email protected]" };
char arr2[] = { "qq" };
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
printf("此串不存在\n");
else
printf("%s\n", ret);
return 0;
}
char * strtok ( char * str, const char * sep );
改进:
1.sep参数是个字符串,定义了用作分隔符的字符集合。
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。
3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
6.如果字符串中不存在更多的标记,则返回 NULL 指针。
返回错误码所对应的错误信息。
C语言的库函数,在执行失败的时候,都会设置错误码。比如:0.1.2……
错误码有其对应的错误信息。
char * strerror ( int errnum );
erron 是C语言设置的一个全局的错误码存放的变量。
只要c语言库函数调用错误,就会把错误码放到erron里面去。
在程序运行过程中如果有多次错误的话,erron记录的是最新的错误码。
strerrno的使用场景
头文件: ctype.h
函数 | 如果他的参数符合下列条件就返回真,不符合就返回假 0 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v' |
isdigit | 十进制数字 0~9 isxdigit 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F |
islower | 小写字母a~z isupper 大写字母A~Z |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
int tolower ( int c );
int toupper ( int c );
举个例子:
你好,我是媛仔!很开心你能够看到这路i,终于整理完字符串函数啦,开心!!如果觉得对你有所帮助的话,希望可以点赞评论收藏,最后再来一个大大的关注让更多的人看到就好啦!!祝你天天开心^-^