补习C

来源:互联网 发布:log4j 写入数据库 mdc 编辑:程序博客网 时间:2024/05/17 04:24

前言:

C语言用过两年了,但并没有系统的看过参考文档,这段时间闲来无事,就系统地看了一边,对以前比较陌生的地方,在这里记下来,以供以后参考。

1、assert  (assert.h)

这是一个宏,调试时使用,如果条件为假,则输出当前文件名和行号,然后退出程序。

#define NDEBUG#include <assert.h>
取消debug功能

2、宏

宏是在一行上定义的,'\' 续行符可以形式上在多行上书写。所以__FILE__, __LINE__可以准确反映是在哪个文件的哪行。先进行宏展开,再进行编译。

#define DBG(msg) \    printf("%s[%s:%d]",msg,__FILE__,__LINE__)DBG("hello world"); //这行代码在哪一行,输出信息中就写着哪一行。
3、errno

errno是一个局限于线程的全局的变量,当系统调用出错时,他们会设置此变量,表明是因为什么原因出错的。如果系统调用正常,不保证设置errno为0(success)。

strerror和perror函数可以得到errno变量的字符串描述

4、不咋使用的头文件

ciso646.h,提供了与,或,异或的别名,个人感觉还是符号比较清楚,所以这东西没必要使用。

limits.h定义了char,short,int,long有无符号的最大和最小值,但实际的值取决于系统和编译器,所以这头文件也没用。

setjmp.h,可以是面向过程的C语言,有跳来跳去的功能。这个东西会是我的思路不清晰,还是不要用了

5、setlocale

迄今仍然不会使用

6、stdarg.h

可变参数列表,很酷的功能,以前畏惧,不敢学,不会用。唉,当时的自己真差劲。

#include <cstdarg>#include <iostream>using namespace std;void f(int n,...){ //这只是个示例。最后一个命名变量应该包含可变变量数量,类型的信息。如printf    va_list vl;    va_start(vl,n); //宏,使vl和最后一个命名变量关联    int i = va_arg(vl,int); //根据变量类型(这里是int)做地址偏移,取出变量值    char *s = va_arg(vl,char*);    cout << "int: " << i << endl        << "char*:" << s << endl;    va_end(vl); //宏嘛,配对的}int main(){    char str[] = "hello";    f(3,12345,str);    return 0;}
7、stdbool.h

C不支持bool类型,C99引入此头文件。此文件定义了一些宏,来支持bool运算。

#define true 1#define false 0
8、stddef.h

  • size_t,以前很害怕这东西,撒吗。原来是表示数量的无符号整形。
  • ptrdiff_t,这是表示两个指针差值的类型
  • offsetof,一个宏,用于C中的sruct,可以得到成员在结构体中的便宜bytes。注:这能用于POD类型
  • NULL,不用说了

9、stdio.h

  • remove, rename可以删除或重命名,要有权限。
  • FILE *tmpfile(void); 产生临时文件,当close文件或程序退出后,此文件会自动被删除。(w+b)
  • tmpnam产生临时文件名,但不建议使用。请使用int mkstemp(char *template),参加stdlib
  • fopen模式r,w,a,b,+; 如果有+,则要注意文件指针,fflush,fseek,fsetpos,rewind
  • stderr,stdout,stdin是指向FILE类型的指针。
  • freopen可以改变文件流打开模式,或将一个流重新关联到一个新的文件。
  • setbuf,设定一块内存区域当做I/O缓冲区使用,如果为空,则编程unbuffered模式;fflush刷新缓冲区。
  • vfprintf,格式化可变参数列表数据到文件中
  • char * gets ( char * str );
    char * fgets ( char * str, int num, FILE * stream );
    gets和fgets不一样,gets从stdin读数据,直到newline or the end-of-file reached,不保留newline符号。fgets可以指定输入流,str大小,且保留newline符号。相同点是两者都会在str结尾加入'\0'
  • getc和fgetc是一样子的,getc可能用宏实现
  • fputs和puts是不一样的。fputs不会加newline符号,而puts会自动加入newline符号。
  • getchar。为什么getc不默认从stdin读数据,因为getchar实现了这个功能。
  • fseek和ftell设置和获得position indicator。通过这两个操作,可以获得文件大小。
  • ferror可以检测对一个文件流的操作过程中,是否出现了错误。
  • feof查看是否达到文件尾。

10、stdlib.h

  • strtol。atoi的增强版本,支持错误指示,各种进制转换,8进制,16进制探测。相同的一个是strtoll,long long int型

  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";  char * pEnd;  long int li1, li2, li3, li4;  li1 = strtol (szNumbers,&pEnd,10);  li2 = strtol (pEnd,&pEnd,16);  li3 = strtol (pEnd,&pEnd,2);  li4 = strtol (pEnd,NULL,0);  printf ("The decimal equivalents are: %ld, %ld, %ld and %ld.\n", li1, li2, li3, li4);

  • rand和srand。 这两个之间的差别s,表示seed,种子。相同的种子可以产生相同的随机数序列。
  • exit
    • 线程存储变量被销毁(C11 only)
    • 静态存储变量被销毁(C++),atexit注册函数被执行
    • 文件被关闭。tmpfile被删除
    • 控制权返还系统
  • getevn得到环境变量。printf("PATH:%s\n",getenv("PATH"));
  • qsort和bsearch。排序和搜索函数。
  • strpbrk和strtok。相比来说,token用的比较多


参考:www.cpluscplus.com