用心做人,用心做事!

发布新日志

  • C++中,头文件stdlib.h主要包含的函数

    2009-01-23 17:21:04

    包含函数: 
    1函数名称: calloc 
    函数原型: void * calloc(unsigned n,unsign size); 
    函数功能: 分配n个数据项的内存连续空间,每个数据项的大小为size 
    函数返回: 分配内存单元的起始地址,如果不成功,返回0 

    2函数名称: free 
    函数原型: void free(void* p); 
    函数功能: 释放p所指的内存区 
    函数返回: 
    参数说明: p-被释放的指针 

    3函数名称: malloc 
    函数原型: void * malloc(unsigned size); 
    函数功能: 分配size字节的存储区 
    函数返回: 所分配的内存区地址,如果内存不够,返回0 

    4函数名称: realloc 
    函数原型: void * realloc(void * p,unsigned size); 
    函数功能: 将p所指出的已分配内存区的大小改为size,size可以比原来分配的空间大或小 
    函数返回: 返回指向该内存区的指针.NULL-分配失败 

    5函数名称: rand 
    函数原型: int rand(void); 
    函数功能: 产生0到32767间的随机整数(0到0x7fff之间) 
    函数返回: 随机整数 

    6函数名称: abort 
    函数原型: void abort(void) 
    函数功能: 异常终止一个进程. 

    7函数名称: exit 
    函数原型: void exit(int state) 
    函数功能: 程序中止执行,返回调用过程 
    函数返回: 
    参数说明: state:0-正常中止,非0-非正常中止 

    8函数名称: getenv 
    函数原型: char* getenv(const char *name) 
    函数功能: 返回一个指向环境变量的指针 
    函数返回: 环境变量的定义 
    参数说明: name-环境字符串 

    9函数名称: putenv 
    函数原型: int putenv(const char *name) 
    函数功能: 将字符串name增加到DOS环境变量中 
    函数返回: 0:操作成功,-1:操作失败 
    参数说明: name-环境字符串 

    10函数名称: labs 
    函数原型: long labs(long num) 
    函数功能: 求长整型参数的绝对值 
    函数返回: 绝对值 

    11函数名称: atof 
    函数原型: double atof(char *str) 
    函数功能: 将字符串转换成一个双精度数值 
    函数返回: 转换后的数值 
    参数说明: str-待转换浮点型数的字符串 

    12函数名称: atoi 
    函数原型: int atoi(char *str) 
    函数功能: 将字符串转换成一个整数值 
    函数返回: 转换后的数值 
    参数说明: str-待转换为整型数的字符串 

    13函数名称: atol 
    函数原型: long atol(char *str) 
    函数功能: 将字符串转换成一个长整数 
    函数返回: 转换后的数值 
    参数说明: str-待转换为长整型的字符串 

    14函数名称: ecvt 
    函数原型: char *ecvt(double value,int ndigit,int *dec,int *sign) 
    函数功能: 将浮点数转换为字符串 
    函数返回: 转换后的字符串指针 
    参数说明: value-待转换底浮点数,ndigit-转换后的字符串长度 

    15函数名称: fcvt 
    函数原型: char *fcvt(double value,int ndigit,int *dec,int *sign) 
    函数功能: 将浮点数变成一个字符串 
    函数返回: 转换后字符串指针 
    参数说明: value-待转换底浮点数,ndigit-转换后底字符串长度
  • C语言的常用类型转换函数

    2009-01-23 13:37:24

    atof(将字符串转换成浮点型数)
    相关函数
         atoi,atol,strtod,strtol,strtoul
    表头文件
         #include <stdlib.h>
    定义函数
         double atof(const char *nptr);
    函数说明
         atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并 将结果返回。参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。
    返回值
         返回转换后的浮点型数。
    附加说明
         atof()与使用strtod(nptr,(char**)NULL)结果相同。
    范例
         /* 将字符串a 与字符串b转换成数字后相加*/
    #include<stdlib.h>
    main()
    {
    char *a=”-100.23”;
    char *b=”200e-2”;
    float c;
    c=atof(a)+atof(b);
    printf(“c=%.2f ”,c);
    }
    执行
         c=-98.23


         
    atoi(将字符串转换成整型数)
    相关函数
         atof,atol,atrtod,strtol,strtoul
    表头文件
         #include<stdlib.h>
    定义函数
         int atoi(const char *nptr);
    函数说明
         atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。
    返回值
         返回转换后的整型数。
    附加说明
         atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。
    范例
         /* 将字符串a 与字符串b转换成数字后相加*/
    #include<stdlib.h>
    mian()
    {
    char a[]=”-100”;
    char b[]=”456”;
    int c;
    c=atoi(a)+atoi(b);
    printf(c=%d ”,c);
    }
    执行
         c=356


         
    atol(将字符串转换成长整型数)
    相关函数
         atof,atoi,strtod,strtol,strtoul
    表头文件
         #include<stdlib.h>
    定义函数
         long atol(const char *nptr);
    函数说明
         atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('')才结束转换,并将结果返回。
    返回值
         返回转换后的长整型数。
    附加说明
         atol()与使用strtol(nptr,(char**)NULL,10);结果相同。
    范例
         /*将字符串a与字符串b转换成数字后相加*/
    #include<stdlib.h>
    main()
    {
    char a[]=”1000000000”;
    char b[]=” 234567890”;
    long c;
    c=atol(a)+atol(b);
    printf(“c=%d ”,c);
    }
    执行
         c=1234567890


         
    gcvt(将浮点型数转换为字符串,取四舍五入)
    相关函数
         ecvt,fcvt,sprintf
    表头文件
         #include<stdlib.h>
    定义函数
         char *gcvt(double number,size_t ndigits,char *buf);
    函数说明
         gcvt()用来将参数number转换成ASCII码字符串,参数ndigits表示显示的位数。gcvt()与ecvt()和fcvt()不同的地方 在于,gcvt()所转换后的字符串包含小数点或正负符号。若转换成功,转换后的字符串会放在参数buf指针所指的空间。
    返回值
         返回一字符串指针,此地址即为buf指针。
    附加说明
         
    范例
         #include<stdlib.h>
    main()
    {
    double a=123.45;
    double b=-1234.56;
    char *ptr;
    int decpt,sign;
    gcvt(a,5,ptr);
    printf(“a value=%s ”,ptr);
    ptr=gcvt(b,6,ptr);
    printf(“b value=%s ”,ptr);
    }
    执行
         a value=123.45
    b value=-1234.56


         
    strtod(将字符串转换成浮点数)
    相关函数
         atoi,atol,strtod,strtol,strtoul
    表头文件
         #include<stdlib.h>
    定义函数
         double strtod(const char *nptr,char **endptr);
    函数说明
         strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('')才结束转换, 并将结果返回。若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。参数nptr字符串可包含正负号、小数 点或E(e)来表示指数部分。如123.456或123e-2。
    返回值
         返回转换后的浮点型数。
    附加说明
         参考atof()。
    范例
         /*将字符串a,b,c 分别采用10,2,16 进制转换成数字*/
    #include<stdlib.h>
    mian()
    {
    char a[]=”1000000000”;
    char b[]=”1000000000”;
    char c[]=”ffff”;
    printf(“a=%d ”,strtod(a,NULL,10));
    printf(“b=%d ”,strtod(b,NULL,2));
    printf(“c=%d ”,strtod(c,NULL,16));
    }
    执行
         a=1000000000
    b=512
    c=65535


         
    strtol(将字符串转换成长整型数)
    相关函数
         atof,atoi,atol,strtod,strtoul
    表头文件
         #include<stdlib.h>
    定义函数
         long int strtol(const char *nptr,char **endptr,int base);
    函数说明
         strtol()会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如 base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用 16进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束 时('')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。
    返回值
         返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。
    附加说明
         ERANGE指定的转换字符串超出合法范围。
    范例
         /* 将字符串a,b,c 分别采用10,2,16进制转换成数字*/
    #include<stdlib.h>
    main()
    {
    char a[]=”1000000000”;
    char b[]=”1000000000”;
    char c[]=”ffff”;
    printf(“a=%d ”,strtol(a,NULL,10));
    printf(“b=%d ”,strtol(b,NULL,2));
    printf(“c=%d ”,strtol(c,NULL,16));
    }
    执行
         a=1000000000
    b=512
    c=65535


         
    strtoul(将字符串转换成无符号长整型数)
    相关函数
         atof,atoi,atol,strtod,strtol
    表头文件
         #include<stdlib.h>
    定义函数
         unsigned long int strtoul(const char *nptr,char **endptr,int base);
    函数说明
         strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36,或0。参数base代表采用的进制方 式,如base值为10则采用10进制,若base值为16则采用16进制数等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则 会使用16进制做转换。一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,再遇到非数字或 字符串结束时('')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。
    返回值
         返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。
    附加说明
         ERANGE指定的转换字符串超出合法范围。
    范例
         参考strtol()


         
    toascii(将整型数转换成合法的ASCII 码字符)
    相关函数
         isascii,toupper,tolower
    表头文件
         #include<ctype.h>
    定义函数
         int toascii(int c)
    函数说明
         toascii()会将参数c转换成7位的unsigned char值,第八位则会被清除,此字符即会被转成ASCII码字符。
    返回值
         将转换成功的ASCII码字符值返回。
    范例
         #include<stdlib.h>
    main()
    {
    int a=217;
    char b;
    printf(“before toascii () : a value =%d(%c) ”,a,a);
    b=toascii(a);
    printf(“after toascii() : a value =%d(%c) ”,b,b);
    }
    执行
         before toascii() : a value =217()
    after toascii() : a value =89(Y)


         
    tolower(将大写字母转换成小写字母)
    相关函数
         isalpha,toupper
    表头文件
         #include<stdlib.h>
    定义函数
         int tolower(int c);
    函数说明
         若参数c为大写字母则将该对应的小写字母返回。
    返回值
         返回转换后的小写字母,若不须转换则将参数c值返回。
    附加说明
         
    范例
         /* 将s字符串内的大写字母转换成小写字母*/
    #include<ctype.h>
    main()
    {
    char s[]=”aBcDeFgH12345;!#$”;
    int i;
    printf(“before tolower() : %s ”,s);
    for(i=0;I<sizeof(s);i++)
    s=tolower(s);
    printf(“after tolower() : %s ”,s);
    }
    执行
         before tolower() : aBcDeFgH12345;!#$
    after tolower() : abcdefgh12345;!#$


         
    toupper(将小写字母转换成大写字母)
    相关函数
         isalpha,tolower
    表头文件
         #include<ctype.h>
    定义函数
         int toupper(int c);
    函数说明
         若参数c为小写字母则将该对映的大写字母返回。
    返回值
         返回转换后的大写字母,若不须转换则将参数c值返回。
    附加说明
         
    范例
         /* 将s字符串内的小写字母转换成大写字母*/
    #include<ctype.h>
    main()
    {
    char s[]=”aBcDeFgH12345;!#$”;
    int i;
    printf(“before toupper() : %s ”,s);
    for(i=0;I<sizeof(s);i++)
    s=toupper(s);
    printf(“after toupper() : %s ”,s);
    }
    执行
         before toupper() : aBcDeFgH12345;!#$
    after toupper() : ABCDEFGH12345;!#$
  • 关于Debug和Release的区别之讨论

    2008-11-28 16:07:14

    关于Debug和Release的区别之讨论本文主要包含如下内容:

    1. Debug 和 Release 编译方式的本质区别
    2. 哪些情况下 Release 版会出错
    2. 怎样“调试” Release 版的程序


    一、Debug 和 Release 编译方式的本质区别
    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程
    序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度
    上都是最优的,以便用户很好地使用。
    Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项
    (当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Rele
    ase 版错误,在此不讨论)
    Debug 版本:
    /MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)
    /Od 关闭优化开关
    /D "_DEBUG" 相当于 #define _DEBUG,打开编译调试代码开关(主要针对
    assert函数)
    /ZI 创建 Edit and continue(编辑继续)数据库,这样在调试过
    程中如果修改了源代码不需重新编译
    /GZ 可以帮助捕获内存错误
    /Gm 打开最小化重链接开关,减少链接时间

    Release 版本:
    /MD /ML 或 /MT 使用发布版本的运行时刻函数库
    /O1 或 /O2 优化开关,使程序最小或最快
    /D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)
    /GF 合并重复的字符串,并将字符串常量放到只读内存,防止
    被修改
    实际上,Debug 和 Release 并没有本质的界限,他们只是一组编译选项的集合,编译
    器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调
    试版本或是带跟踪语句的发布版本。

    二、哪些情况下 Release 版会出错

    有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的

    1. Runtime Library:

    2. 优化:这类错误主要有以下几种:

    (1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息
    (返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返
    回值、调用方式),就会产生错误————但 Debug 方式下,栈的访问通过 EBP 寄存器
    保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能
    正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈
    就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如
    果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关
    掉帧指针省略,以确定是否此类错误。
    (2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改
    (如系统、其他进程和线程)。

    (3) 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被
    使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在 Release 版中,这个变量
    很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得
    多。与此有关的错误有:

    3. _DEBUG 与 NDEBUG :当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不
    被编译。除此之外,VC++中还有一系列断言宏。这包括:

    ANSI C 断言 void assert(int expression );
    C Runtime Lib 断言 _ASSERT( booleanExpression );
    _ASSERTE( booleanExpression );
    MFC 断言 ASSERT( booleanExpression );
    VERIFY( booleanExpression );
    ASSERT_VALID( pObject );
    ASSERT_KINDOF( classname, pobject );
    ATL 断言 ATLASSERT( booleanExpression );
    此外,TRACE() 宏的编译也受 _DEBUG 控制。

    4. /GZ 选项:这个选项会做以下这些事

    (1) 初始化内存和变量。
    (2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原
    形不匹配)
    (3) 函数返回前检查栈指针,确认未被修改.

    三、怎样“调试” Release 版的程序

    1. 前面已经提过,Debug 和 Release 只是一组编译选项的差别,实际上并没有什么
    定义能区分二者。我们可以修改 Release 版的编译选项来缩小错误范围。如上所述,可以
    把 Release 的选项逐个改为与之相对的 Debug 选项,如 /MD 改为 /MDd、/O1 改为 /Od
    ,或运行时间优化改为程序大小优化。注意,一次只改一个选项,看改哪个选项时错误消
    失,再对应该选项相关的错误,针对性地查找。这些选项在 Project\Settings... 中都可
    以直接通过列表选取,通常不要手动修改。由于以上的分析已相当全面,这个方法是最有
    效的。
    2.你也可以像 Debug 一样调试你的 Release 版,只要加入调试符号。在 Project/S
    ettings... 中,选中 Settings for "Win32 Release",选中 C/C++ 标签,Category 选
    General,Debug Info 选 Program Database。再在 Link 标签 Project options 最后
    加上 "/OPT:REF" (引号不要输)。

Open Toolbar