一些常见函数

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

函数解释:将s中前n个字节替换为c并返回s; 

头文件<CString>

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

memset是按照字节来进行清除工作的,所以下面这种用法是错误的:

#include <iostream> 
#include <cstring>   
using namespace std;   
int main()   
{
int a[5];   
memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的  
 for(int i = 0;i < 5;i++)   
cout<<a[i]<<" ";   
system("pause");  
return 0;   
}

这样做的后果是将a数组的开头五个字节重置为0X0101010101,而不是将每个数组元素置为1.只有待重置的值为-1或0时才会将所有字节置为0X00000000或0X11111111.

2.void *memcpy(void *dest, const void *src, size_t n);

 函数功能:由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内。函数返回一个指向dest的指针。

头文件:<CString>
1.source和destin所指内存区域不能重叠,函数返回指向destin的指针

2.与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。

3.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,

要将目标数组地址增加到你要追加数据的地址。

3.FILE *freopen(char *filename, char *type, FILE *stream); 

函数功能: 替换一个流,或者说重新分配文件指针,实现重定向。

头文件:<CStdio>

函数应用示例:

从文件in.txt中读入数据,计算加和输出到out.txt中  
#include <iostream.h>   
#include <cstdio.h>   
using namespace std;  
int main()   
{  
freopen("in.txt","r",stdin);   
freopen("out.txt","w",stdout);  
 int a,b;   
while(scanf("%d%d",&a,&b)!=EOF)  
 printf("%d\n",a+b);  
 fclose(stdin);   
fclose(stdout);   
return 0;  
}
若要返回到显示默认 stdout) 的 stdout,使用下面的调用:   
freopen( "CON", "w", stdout ); //输出到控制台"CON"   
下面是短程序演示了 stdout 时重定向:   
#include <stdio.h>   
#include <stdlib.h>   
void main(void)   
{   
FILE *stream ; //将内容写到file.txt, "W"是写 ("r"是读)   
if((stream = freopen("file.txt", "w", stdout)) == NULL)  
 exit(-1); printf("this is stdout output\n");   
stream = freopen("CON", "w", stdout);stdout 是向程序的末尾的控制台重定向   
printf("And now back to the console once again\n");  
}
size_t strlen( const char *string )

函数功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内 。

它与sizeof()的区别:

sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数

 

char str[20]="0123456789"

sizeof(str)结果是20;

char* ss = "0123456789";   sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个

指针的之所占的空间,应该是长整型的,所以是4

 

4、malloc/calloc/realloc

   这三个函数都是用来进行内存分配的。包含在stdlib.h文件中。

   malloc函数原型为extern void *malloc(unsigned int num_bytes);

   calloc函数原型为void *calloc(unsigned n,unsigned size); 在内存的动态存储区中分配n个长度为size的连续空间。与molloc不同的是它将空间内容初始化为0;

   realloc函数原型为extern void *realloc(void *mem_address, unsigned int newsize);  按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。mem_address必须为malloc或者calloc函数分配的地址指针

5、void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));

   参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序

     qsort 的函数原型是void __cdecl qsort ( void *base, size_tnum, size_t width, int (__cdecl *comp)(const void *, const void* ) )

     其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。
     比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。
     qsort(a,1000,sizeof(int ),comp);
     其中comp函数应写为:
     int comp(const void *a,const void *b)

  {

       return *(int *)a-*(int *)b;

      }

     上面是由小到大排序,return *(int *)b-*(int *)a; 为由大到小排序。
     对一个二维数组的进行排序: 
     int a[1000][2]; 其中按照a[0]的大小进行一个整体的排序,其中a[1]必须和a[0]一起移动交换。
  qsort(a,1000,sizeof(int)*2,comp); 
    int comp(const void *a,const void *b)
  {
 
     return ((int *)a)[0]-((int *)b)[0];
 
  }
posted @ 2012-03-04 12:58  Ranger98  阅读(217)  评论(0)    收藏  举报