结构体、字符串函数复习记录

以多少个字节为单位分配内存
找结构体中占字节数最多的基本类型,以它的字节数为单位为结构体开辟内存。
注意:
当有double 类型成员的时候
vc中以八字节为单位开辟内存,double 类型的成员为8字节对齐
gcc 以四字节为单位开辟内存,并且double类型的成员为4字节对齐


字节对齐
char型成员1字节对齐,即随便一个字节空间都可以存放char型数据
short型成员 2字节对齐,即存放short型成员的内存编号必须是2的倍数
int 型成员 4字节对齐,及存放int型成员的内存边行必须是4的倍数

字符串函数的实现

/*
原型声明:char *strcpy(char* dest, const char *src);
头文件:#include <string.h> 和 #include <stdio.h>
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
*/
char * strcpy(char *dest,const char *src)
{
  char *tmp = dest;
 
  while((*dest++ = *src++) != '\0')

  return tmp;
}

/*trcpy只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出。strncpy要安全一些*/
char * strncpy(char *dest,const char *src,size_t count)
{
  char *tmp = dest;

  while(count-- && (*dest++ = *src++) != '\0')

  return tmp;  
}

/*
将两个char类型连接。
char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);
结果放在d中
printf("%s",d);
输出 d 为 GoldenGlobalView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的指针。
*/
char *strcat(char *dest,const char *src)
{
  char *tmp = dest;

  while(*dest)
    dest++;
  while((*dest++ = *src++) != '\0')
    ;
  return tmp;

}

/*功能
把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接。
说明
src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串。
返回值
返回指向dest的指针*/
char * strncat(char *dest,const char *src,size_t count)
{
  chat *tmp = dest;

  if(count)
  {
    while(*dest)
      dest++;
    while((*dest++ = *src++))
    {
      if(--count == 0)
      {
        *dest = '\0';
        break;
      }
        
    }
  }
  return tmp;
}

/*当s1<s2时,返回为负数;
当s1==s2时,返回值= 0;
当s1>s2时,返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。
*/
int strcmp(char *s1,char *s2)
{
  while(*s1 && *s2)
 {
    if(*s1 - *s2)
      return (*s1 - *s2);
    s1++;
    s2++;
 }
 if(*s1 != 0)
   return 1;
 else
  return -1;
 return 0;
}

/*
int strncmp ( const char * str1, const char * str2, size_t n );
str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。
字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strncmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,直到字符结束标志'\0',若差值不为0,则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。注意:要比较的字符包括字符串结束标志'\0',而且一旦遇到'\0'就结束比较,无论n是多少,不再继续比较后边的字符。
*/

int strncmp(char *s1, char *s2, int len)
{
    
  while(len--)
    
  {
        
    if(*s1 && *s2)
        
    {
            
       if(*s1 - *s2)
                
         return (*s1 - *s2);
            
       s1++;
            
      s2++;
        
    }
        
    else
        
    {
            
      if(*s1 || *s2)
                
        return(*s1? *s1: *s2);
        
    }
    
  }
    
  return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值