指针、关系运算符、strcpy,strcmp,strcat等函数的自定义函数,及十进制转十六进制程序

关系运算符

在编写程序进行赋值的时候(==),注意将常量放在左边

unsigned int mask=0x80000000;    //掩码

num&0x80000000:注意强制类型转化 

使用“与”的情况:

①清0特定位         ②取某数中指定位

(公式:unsigned int mask=unsigned int)((~unsigned int0>>32-n-m+1))<<m;

左移以“0”补位,右移以符号位补位

若要都以“0”补位,那就需要以无符号数定义


使用“或”的情况:用来将源操作数某些位置1

 

使用“异或”的情况:①使特定位的值取反       ②不引用第三变量,交换两变量的值

用异或交换两变量的值:

int a=5;

int b=6;

a=a^b;

b=a^b;

a=a^b; 

指针

定义:指针是一个变量,它保存的是地址

例:int num=5;其十六进制为0x00000005


&num=0x1000

地址的0x1000与字节的0x1000的定义不一样,因为两者的步长不一致

 

 

int num=5int *p=&num;(p=&num   *p=num=*&num))

num=*p=**pp=*(&num);&num==p==*pp

num=*p=**pp=***ppp=*(&num);&num==p==*pp=**ppp


num++:num对应的内存空间的值加1

p++:p对应的内存空间的值加1(步长)

*p:根据对应内存空间里保存的地址找到其对应的内存空间(对p指向的内存空间操作)

*p++的意义与num++一致

p++0x10001  与(*pp++ 一致

pp++pp00x20004,变为0x2004

***ppp:超过两个以上的*,则成为这个为远指针或者巨指针

 

野指针定义:随机指向一块内存的指针,会导致内存泄漏(原因:访问已经释放的内存或者访问里不存在的空间)

 

字符串就是首字符地址

 

用函数实现strlen

int my_strlen(char *src)

{

    int len=0;

    while(src!='\0')

    {

        src++;

        len++;

    }

    return len;

}

用函数实现strcpy

char *my_strcpy(char *dest,char *src)

 {

     char *temp=dest;

     while(*src!='\0')

     {

         *temp=*src;

         src++;

         temp++;

     }

     *temp='\0';

     return dest;

 }

用函数实现strncpy

char *my_strncpy(char *dest,char *src,int n)

 {

     char *temp=dest;

     int i=0;

     while(*src!='\0')

     {

        for(i=0;i<n;i++)

         {

             *temp=*src;

             src++;

             dest++;

         }

         temp='\0';

         return dest;

    }

 }

用函数实现strcat

char *my_strcat(char *dest,char *src)

{

      char *temp=dest;

      while(*temp!='\0')

      {

         temp++;

     }

     while(*src!='\0')

      {

          *temp=*src;

          src++;

          temp++;

     }

      *temp='\0';

      return dest;

 }

用函数实现strncat

char *my_strncat(char *dest,char *src,int n)

{

char *temp=dest;

int i=0;

while(*temp!=’\0’)

{

    temp++;

}

for(i=0;i<n;i++)

{

    *temp=*src;

    src++;

    temp++;

}

*temp=’\0’;

return dest;

}

用函数实现strcmp

int my_strncpy(char *dest,char *src)

{

while(*src!=’\0’&&*dest!=’\0’)

{

    If(*dest<*src)

    {

         return -1;

    }

    If(*dest>*src)

    {

        return 1;

    }

    src++;

    dest++;

}

If(*src!=’\0’&&*dest==’\0’)

{

    return -1;

}

If(*src==’\0’&&*dest==’\0’)

{

    return 0;

}

If(*src==’\0’&&*dest!=’\0’)

{

    return  1;

}

}

将十进制数转化为十六进制数:

#include<stdio.h>

 

char *int2hex(unsigned int num)

{

static char hex[11];

hex[0]=’0’;

hex[1]=’x’;

hex[10]=’\0’;

unsigned int mask=0x0000000f;

int i=0;

for(i=9;i>=0;i--)

{

    hex[i]=num&mask;

    if((unsigned int)(num&mask)<10)

    {

       hex[i]=(num&mask)+’0’;

    }

    if((unsigned int )(num&mask)>=10)

    {

        hex[i]=(num&mask)-10+’a’;

    }

    num=num>>4;

}

return hex;

}

int main()

{

unsigned int num;

printf(“please input a number:”);

scanf(“%d”,&num);

char *temp=int2hex(num)

printf(“the result is:%c\n”,temp);

}

 

 

 

比如说字符串dasheuhhellodfndsworldcni,输入头为hello,输入尾为world,那么结果为hellodfndsworld

 

程序为:

#include<stdio.h>

#include<string.h>

#define MAX_SIZE 1024

 

int my_strncmp(char *src,char *head,int len)

{

int i=0;

for(i=0;i<len;i++)

{

    if(*(src+i)!=*(head+i))

    {

       return -1;

    }

    return 0

}

}

 

char *string(char *src,char *head,char *tail)

{

int h_len=strlen(head);

int t_len=strlen(tail);

char *temp;

while(*src!=’\0’)

{

   if(my_strncmp(src,head,h_len)==0)

    {

        temp=src;

        src=src+h_len;

    while(*src!=’\0’)

    {

       if(my_strncmp(src,tail,t_len)==0)

        {

            *(src+t_len)=’\0’;

            return temp;

        }

        src++;

    }

    return NULL;

 

    }

    src++;

}

return NULL;

}

int main()

{

char src[MAX_SIZE];

char head[MAX_SIZE];

char tail[MAX_SIZE];

printf(“please input string:”);

scanf(“%c”,src);

printf(“please input head:”);

scanf(“%c”,head);

printf(“please input tail:”);

scanf(“%c”,tail);

char *temp=string(src,head,tail);

printf(“temp=%c\n”,temp);

return 0;

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值