C语言复习笔记--字符函数和字符串函数(上)
在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。
首先来看下字符函数.
字符分类函数
C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h.具体的一些函数和功能见下.
这些函数的使⽤⽅法⾮常类似,我们来以islower来看下,islower是判断字符是否为小写字母的函数.函数原型见下
int islower ( int c );
通过返回值来说明是否是⼩写字⺟,如果是小写字母就返回非0的整数,如果不是⼩写字⺟,则返回 0。
下面让我们通过一个练习来使用一下它
写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。
#include<stdio.h>
#include<ctype.h>
int main()
{char arr[] = { "AccDSnj" };char* p = arr;while (*p){if (islower(*p)){*p -= 32;//小写ASCII码-32就会变为大写}p++;}printf("%s\n", arr);return 0;
}
字符转换函数
C语⾔提供了2个字符转换函数:
看见了这两个函数后,上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数现在就可以直接使⽤ toupper函数.
#include<ctype.h>
int main()
{char arr[] = { "AccDSnj" };char* p = arr;while (*p){if (islower(*p)){*p = toupper(*p);//toupper的返回值才是所传参数的大写,所以直接toupper(*p);无法改变arr中的值}p++;}printf("%s\n", arr);return 0;
}
使用这些函数一定要包含<ctype.h>这个头文件.
下面来看下字符串函数吧.
strlen的使用和模拟实现
首先看下它的函数原型
size_t strlen ( const char * str );
下面看下使用的主意事项
要包含<string.h>这个头文件.且返回值为无符号整型,无符号整型进行加减是不会出现<0的数的.
我们对strlen应该很熟悉了,在之前我们就已经使用过并且用两种方式模拟实现过strlen(指针-指针和指针后移用count计数)下面我们看下不能创建临时变量计数器怎么实现strlen函数.
//可以用递归的方式去实现
size_t strlen(char* p)
{if ('\0'== * p){return 0;}else{return 1 + strlen(p + 1);}
}
int main()
{char arr[] = { "asffsg" };printf("%d\n", strlen(arr));return 0;
}
strcpy的使用和模拟实现
函数原型.
char* strcpy(char * destination, const char * source );
函数作用将source位置的字符串copy到destination的位置上(包括source字符串中的\0)
下面看下注意事项
strcpy的自主实现:
char* strcpy(char* des, const char* p)
{char* re = des;//先保存一下目标位置的开始,以便函数返回while (*des++ = *p++){;}//刚好到最后'\0'时*p赋给了*des//并且*des++ = *p++式子的返回值是'\0'(ASCII码为0)循环刚好结束return re;
}
int main()
{char arr[20] = { 0 };char* p = "asbcde";//被拷贝的可以是不可修改的也可以可以修改的字符串//printf("%s\n",strcpy(arr, p));//这种和下面的那种都可以char* s = strcpy(arr, p);printf("%s\n", s);return 0;
}
strcat 的使用和模拟实现
先看函数原型
char * strcat (char *dest, const char*src);
函数作用:在dest字符串后追加src字符串,覆盖dest字符串的\0,但是会追加src的\0.
下面是一些注意事项.
\
以及思考一个问题字符串⾃⼰给⾃⼰追加,如何?
根据函数作用来看是不可以的,因为在追加时会覆盖原来字符串的\0,之后就无法找到要追加的字符串的结束标志了.但是在VS的库函数中的strcat可以做到,但是不建议使用strcat自己给自己追加,因为这只是编译器的自行优化,可能其他编译器下就不可以了.
下面来看实现:
char* strcat(char* des,const char* p)
{char* re = des;while (*des){des++;}while (*des++ = *p++){;}return re;
}
int main()
{char arr[20] = "abc";printf("%s\n", arr);char* p = "xxx";strcat(arr, p);printf("%s\n", arr);return 0;
}
因为上面介绍的三个函数在使用时可能会发生原来空间不够大导致溢出从而引发错误,为了避免这样的错误,函数库中提供了可以由程序员控制拷贝字母数的下面三个函数.这些函数无需自己实现,只要会使用就可以了.
strncpy 函数的使用
首先来看下函数原型
char * strncpy ( char * destination, const char * source, size_t num );
作用:将source的字符串的前num的字符拷贝到destination的位置上.
如果源字符串长度大于num则num是几就拷贝几个,不在后面追加\0.下面看下使用:
#include <string.h>
int main()
{char arr[20] = "xxxxxxxxxxxxx";char* p = "abc";strncpy(arr, p, 2);printf("%s\n", arr);strncpy(arr, p, 5);printf("%s\n", arr);return 0;
}
输出结果:
strncmp函数的使用
函数原型:
int strncmp ( const char * str1, const char * str2, size_t num );
比较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.(num不能大于str1和str2中短的那个字符串的长度(算\0)).
下面是此函数的返回值:
下面看下使用
#include <string.h>
int main()
{char* p = "abcd";char* p1 = "abp";printf("%d\n",strncmp(p, p1, 2));printf("%d\n",strncmp(p, p1, 3));return 0;
}
输出结果:
strncat 函数的使用
函数原型:
char * strncat ( char * destination, const char * source, size_t num );
如果source 指向的字符串的⻓度⼩于num的时候,不会向后添加\0让追加字符数达到num.
下面看下使用:
#include <string.h>
int main()
{char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);printf("%s\n", str1);return 0;
}
输出结果:
今天的复习就到这里了,我们明天下篇见.