1.字符分类函数
在我们的日常代码生活中,经常会遇到一类问题,比如说判断一个字母的大小写,或者标点符号等。因此,我们需要用到一些字符分类函数
函数
|
如果他的参数符合下列条件就返回真
|
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 );
tolower与toupper是把一个字母变成小写或者是大写。
至于参数为什么是int,在之前我们已经说过了,在这里就不在多提了
#include <stdio.h>
#include <ctype.h>
int main ()
{
int i=0;
char str[]="Test String.\n";
char c;
while (str[i])
{
c=str[i];
if (isupper(c))
c=tolower(c);
putchar (c);
i++;
}
return 0;
2.内存处理函数
之前我们了解到的一些函数都是字符串或者是字符函数,很明显那是针对字符或者是字符串的,但是如果我们相对一个整形的数组进行类似的处理呢?这个时候就需要用的内存处理函数,因为内存处理函数是对内存进行的改变,因此,不论是何种类型都可以使用。
1.memcpy
好的,因为我们之前了解了一些关于字符串的函数,所以这个一眼就能猜出是什么意思,也就是内存复制函数。我们还是先来看他的定义。
void * memcpy ( void * destination, const void * source, size_t num );
第一个参数的意思是目标地址,第二个参数是源地址,第三个是要复制的内存大小,单位是字节。
为什么参数类型是void的,很简单,因为这是内存处理函数,我们可能会用它来处理各种各样不同类型的数据,因此我们需要一个类型来接受各种不同的类型,所以这里采用了void类型的指针。
下面我们来看一下相关的注意事项
1.函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。2.这个函数在遇到 '\0' 的时候并不会停下来。3.如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。
ok,下面我们还是通过一个栗子来看一下这个代码的具体作用
#include <stdio.h>
#include <string.h>
struct {
char name[40];
int age;
} person, person_copy;
int main()
{
char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy(person.name, myname, strlen(myname) + 1);
person.age = 46;
/* using memcpy to copy structure: */
memcpy(&person_copy, &person, sizeof(person));
printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
return 0;
}
关于函数的实现这里我就不再做过多的讲解了,大家看一下代码吧
char * strstr (const char * str1, const char * str2)
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && !(*s1-*s2) )
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
2.memmove
ok,下面来看memmove啊,还是首先来看他的定义。
void * memmove ( void * destination, const void * source, size_t num );
话不多说,直接上注意事项
1.和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的。2.如果源空间和目标空间出现重叠,就得使用 memmove 函数处理。
还是话不多说直接来栗子
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
}
还是话不多少,直接上实现代码
void * memmove ( void * dst, const void * src, size_t count)
{
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
3.memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
比较从ptr1和ptr2指针开始的num个字节
栗子
#include <stdio.h>
#include <string.h>
int main ()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
return 0;
}
ok,我们就不在对这个函数进行实现了,有感兴趣的可以自己试一下。
那么,这篇文章就到这里了,关于这块的内容要就到此为止,下一步我将开始更新与自定义类型有关的博客。