字符函数和字符串函数(三)

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 );

比较从ptr1ptr2指针开始的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,我们就不在对这个函数进行实现了,有感兴趣的可以自己试一下。

那么,这篇文章就到这里了,关于这块的内容要就到此为止,下一步我将开始更新与自定义类型有关的博客。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值