常用函数总结

来源:互联网 发布:淘宝上化妆品正品店铺 编辑:程序博客网 时间:2024/05/17 08:26

(1)memset 函数

  【函数头文件】 #include<string.h>

   
    void *memset(void *s, int c, size_t n);

   【使用说明】 The  memset()  function  fills  the  first  n  bytes of the memory area  pointed to by s with the constant byte c.
   【错误用法】
     int array[10];
     memset(array,1,10);//或者memset(array,1,sizeof(array)),都是不对的!

     因为memset函数使用说明中提到的是按照byte来填充。

      举例来说
       char arr[10]; memset(arr,'a',10);
       由于char只占一个字节(byte),因此函数的结果是将连续的10个字节都填充为'a'。这是我们所期待的结果!

       int arr[10];memset(arr,1,10);
       由于int占4个字节(byte),因此"1"对应的二进制(32bits下)为"00000000000000000000000000000001"(4bytes),塞到1byte(8bit)的中,高位被舍弃了。所以,填入数组中的值是"00000001"。然而总共有10*4=40个byte,却只有10个byte被填充,因此结果是"00000001……00000001**********"(前面总共10个"00000001")。因此,第一个数是"0x01010101"=16843009(10进制)数组其余部分的值则是随机值,读取出来会是很离谱的数!
       有人说,可以这样memset(arr,1,sizeof(arr));
       其实这样做,就是将数组的所有值都填充为"0x01010101",也就是int数组的初始值变为了16843009
 !这确实有点出乎我们的预料!

  【正确用法】
    方法一:可以用任何值来初始化char数组!比如 memset(arr,'a',10);

   方法二:可以用"0"来初始化任何类型数组!比如 memset(arr,0,sizeof(arr));//arr可以是char或int等类型数组!

   方法二:可以用"-1"来初始化任何类型数组!比如 memset(arr,-1,sizeof(arr));//arr可以是char或int等类型数组!

   【小结】本节部分参考:blog.csdn.net/whuslei  特此感谢。


(2)strlen 函数

  【函数头文件】 #include<string.h>

 格式:strlen (字符数组名)
 功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
 说明:返回s的长度,不包括结束符NULL。

与sizeof()的区别

strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
 char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
 char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
 char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3

而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
 sizeof(aa) 返回10
 int a[10]; sizeof(a) 返回40 (根据语言int型 c 是两个字节 c++是四个 java 是两个)
⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是操作符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:
short f();
printf("%d\n",sizeof(f()));
输出的结果是sizeof(short),即2。
⒋数组做sizeof的参数不退化,传递给strlen就退化为指针了。
⒌大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

(3)size( ) 函数

  【函数头文件】 #include<stdlib.h>

 格式:数组名.size()
 功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
 说明:返回数组的实际长度,不包括结束符NULL。
 如:vector<int> v;
   v.push_back(3);
   则
   v.size()=1;


(4)sort( ) 函数

  【函数头文件】 #include <algorithm>

 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。
   如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp。

   如:定义一个降序排列的cmp函数
bool cmp(int a,int b){  return a>b;}
   
    也可以对结构体数组进行排序:
  NYOJ第8题:
现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复;还知道这个长方形的宽和长,编号、长、宽都是整数;现在要求按照一下方式排序(默认排序规则都是从小到大);

1.按照编号从小到大排序

2.对于编号相等的长方形,按照长方形的长排序;

3.如果编号和长都相同,按照长方形的宽排序;
  
struct Point{int a,b,c;};

排序:
bool cmp(const Point &x,const Point &y){     if(x.a!=y.a)return x.a<y.a;     if(x.b!=y.b)       return x.b<y.b;     return x.c<y.c;}
注意结构体比较时,前面必须加上const。


0 0