c语言漫谈(程序员看到C语言)
c语言漫谈(程序员看到C语言)
2024-06-30 10:10:37  作者:带刺仙人掌  网址:https://m.xinb2b.cn/sport/jfo166331.html

第一章(C标准库)1.<assert.h>:诊断,下面我们就来聊聊关于c语言漫谈?接下来我们就一起去了解一下吧!

c语言漫谈(程序员看到C语言)

c语言漫谈

第一章(C标准库)

1.<assert.h>:诊断

2.<ctype.h>:字符类别测试

3.<errno.h>:错误处理

4.<limits.h>:整型常量

5.<locale.h>:地域环境

6.<math.h>:数学函数

7.<setjmp.h>:非局部跳转

8.<signal.h>:信号

9.<stdarg.h>:可变参数表

10.<stddef.h>:公共定义

11.<stdio.h>:输入输出

12.<stdlib.h>:实用函数

13.<time.h>:日期与时间函数

1. <assert.h>:诊断

  <assert.h>中只定义了一个带参的宏assert,其定义形式如下:

void assert (int 表达式)

  assert宏用于为程序增加诊断功能,它可以测试一个条件并可能使程序终止。在执行语句:

assert(表达式);

时,如果表达式为0,则在终端显示一条信息:

Assertion failed: 0, FILE 源文件名, line 行号

Abnormal program termination

然后调用abort终止程序的执行。

在<assert.h>中,带参宏assert是被定义为条件编译的,如果在源文件中定义了宏NDEBUG,则即使包含了头文件<assert.h>,assert宏也将被忽略。

2. <ctype.h>:字符类别测试

  在头文件<ctype.h>中定义了一些测试字符的函数。在这些函数中,每个函数的参数都是整型int,而每个参数的值或者为EOF,或者为char类型的字符。<ctype.h>中定义的标准函数列表如下:

<ctype.h>中定义的函数

函数定义, 函数功能简介

int isalnum(int c), 检查字符是否是字母或数字

int isalpha(int c), 检查字符是否是字母

int isascii(int c), 检查字符是否是ASCII码

int iscntrl(int c), 检查字符是否是控制字符

int isdigit(int c), 检查字符是否是数字字符

int isgraph(int c), 检查字符是否是可打印字符

int islower(int c), 检查字符是否是小写字母

int isprint(int c), 检查字符是否是可打印字符

int ispunct(int c), 检查字符是否是标点字符

int isspace(int c), 检查字符是否是空格符

int isupper(int c), 检查字符是否是大写字母

int isxdigit(int c), 检查字符是否是十六进制数字字符

int toupper(int c), 将小写字母转换为大写字母

int tolower(int c), 将大写字母转换为小写字母

, ,

  有关<ctype.h>中定义的这些标准函数以及一些常用的非标准字符处理函数将在第十一章中进行详细地介绍。

  

3. <errno.h>:错误处理

  <errno.h>中定义了两个常量,一个变量。

1、 EDOM

它表示数学领域错误的错误代码。

2、 ERANGE

它表示结果超出范围的错误代码。

3、 errno

这是一个变量,该值被设置成用来指出系统调用的错误类型。

  

4. <limits.h>:整型常量

  在头文件<limits.h>中定义了一些表示整型大小的常量。下面给出这些常量的字符表示以及含义,见下表。

<limits.h>中定义的字符常量字符常量, 取值, 含义

CHAR_BIT, 8, char类型的位数

CHAR_MAX, 255或127, char类型最大值

CHAR_MIN, 0或-127, char类型最小值

INT_MIN, -32767, int类型最小值

INT_MAX, 32767, int类型最大值

LONG_MAX, 2147483647, long类型最大值

LONG_MIN, -2147483647, long类型最小值

SCHAR_MAX, 127, signed char 类型最大值

SCHAR_MIN, -127, signed char 类型最小值

SHRT_MAX, 32767, short类型的最大值

SHRT_MIN, -32767, short类型的最小值

UCHAR_MAX, 255, unsigned char 类型最大值

UINT_MAX, 65535, unsigned int 类型最大值

ULONG_MAX, 4294967295, unsigned long 类型最大值

USHRT_MAX, 65535, unsigned short类型的最大值

  

5. <locale.h>:地域环境

在<locale.h>中,定义了7个常量,一个结构,2个函数。

1、常量的定义

  LC_ALL:传递给setlocale的第一个参数,指定要更改该locale的哪个方面。

  LC_COLLATE:strcoll和strxfrm的行为。

  LC_CTYPE:字符处理函数。

  LC_MONETARY:localeconv返回的货币信息。

  LC_NUMERIC:localeconv返回的小数点和货币信息。

  LC_TIME:strftime的行为。

  以上扩展成具有唯一取值的整型常数表达式,可作为setlocale的第一个参数。

  NULL:由实现环境定义的空指针。

  2、struct lconv结构

  该结构用于存储和表示当前locale的设置。其结构定义如下:

struct lconv

{

char *decimal_point;

char *thousands_sep;

char *grouping;

char *int_curr_symbol;

char *currency_symbol;

char *mon_decimal_point;

char *mon_thousands_sep;

char *mon_grouping;

char *positive_sign;

char *negative_sign;

char int_frac_digits;

char frac_digits;

char p_cs_precedes;

char p_sep_by_space;

char n_cs_precedes;

char n_sep_by_space;

char p_sign_posn;

char n_sign_posn;

};

  3、函数

  struct Iconv *localeconv(void);

  函数localeconv将一个struct Iconv类型的对象的数据成员设置成为按照当前地域环境的有关规则进行数量格式化后的相应值。

  char *setlocale(int category,char * locale);

  函数setlocale用于更改和查询程序的整个当前地域环境或部分设置。地域环境变量由参数category(上面定义的6个常量)和locale指定。

6. <math.h>:数学函数

  在<math.h>中定义了一些数学函数和宏,用来实现不同种类的数学运算。下面给出<math.h>中标准数学函数的函数定义及功能简介,见下表。

<math.h>中定义的函数

函数定义, 函数功能简介

double exp(double x);, 指数运算函数, 求e的x次幂函数

double log(double x), 对数函数ln(x)

double log10(double x); , 对数函数log

double pow(double x, double y);, 指数函数(x的y次方)

double sqrt(double x); , 计算平方根函数

double ceil(double x); , 向上舍入函数

double floor(double x);, 向下舍入函数

double fabs(double x);, 求浮点数的绝对值

double ldexp(double x, int n); , 装载浮点数函数

double frexp(double x, int* exp); , 分解浮点数函数

double modf(double x, double* ip); , 分解双精度数函数

double fmod(double x, double y);, 求模函数

double sin(double x); , 计算x的正弦值函数

double cos(double x);, 计算x的余弦值函数

double tan(double x);, 计算x的正切值函数

double asin(double x);, 计算x的反正弦函数

double acos(double x); , 计算x的反余弦函数

double atan(double x); , 反正切函数1

double atan2(double y, double x); , 反正切函数2

double sinh(double x); , 计算x的双曲正弦值

double cosh(double x); , 计算x的双曲余弦值

double tanh(double x); , 计算x的双曲正切值

  在标准库中,还有一些与数学计算有关的函数定义在其他头文件中。

7. <setjmp.h>:非局部跳转

  在头文件<setjmp.h>中定义了一种特别的函数调用和函数返回顺序的方式。这种方式不同于以往的函数调用和返回顺序,它允许程序流程立即从一个深层嵌套的函数中返回。

  <setjmp.h>中定义了两个宏:

int setjmp(jmp_buf env);

  和

longjmp(jmp_buf jmpb, int retval);

  宏setjmp的功能是将当前程序的状态保存在结构env ,为调用宏longjmp设置一个跳转点。setjmp将当前信息保存在env中供longjmp使用。其中env是jmp_buf结构类型的,该结构定义为:

typedef struct {

unsignedj_sp;

unsignedj_ss;

unsignedj_flag;

unsignedj_cs;

unsignedj_ip;

unsignedj_bp;

unsignedj_di;

unsignedj_es;

unsignedj_si;

unsignedj_ds;

}jmp_buf[1];

  直接调用setjmp时,返回值为0,这一般用于初始化(设置跳转点时)。以后再调用longjmp宏时用env变量进行跳转。程序会自动跳转到setjmp宏的返回语句处,此时setjmp的返回值为非0,由longjmp的第二个参数指定。

  下面通过例子来理解<setjmp.h>中定义的这两个宏。

  例程9-1 非局部跳转演示。

#include <setjmp.h>

jmp_buf env;

int main(void)

{

int value;

value = setjmp(env);

if (value != 0)

{

printf("Longjmp with value %d\n", value);

exit(value);

}

printf("Jump ... \n");

longjmp(env,1);

return 0;

}

  本例程先应用setjmp宏为longjmp设置跳转点,当第一次调用setjmp时返回值为0,并将程序的当前状态(寄存器的相关状态)保存在结构变量env中。当程序执行到longjmp时,系统会根据setjmp保存下来的状态env跳转到setjmp语句处,并根据longjmp的第二个参数设置此时setjmp的返回值。

  本例程的运行结果为:

Jump ...

Longjmp with value 1

  一般地,宏setjmp和longjmp是成对使用的,这样程序流程可以从一个深层嵌套的函数中返回。

8. <signal.h>:信号

  头文件<signal.h>中提供了一些处理程序运行期间引发的各种异常条件的功能,例如一些来自外部的中断信号等。

  在<signal.h>中只定义了两个函数:

int signal(int sig, sigfun fname);

  和

int raise(int sig);

  signal函数的作用是设置某一信号的对应动作。其中参数sig用来指定哪一个信号被设置处理函数。在标准C 中支持的信号如下表。

标准C支持的信号

取值, 说明, 默认执行动作, 使用的操作系统

SIGABRT, 异常中止, 中止程序, UNIX DOS

SIGPPE, 算术运算错误, 中止程序, UNIX DOS

SIGILL, 非法硬件指令, 中止程序, UNIX DOS

SIGINT, 终端中断, 中止程序, UNIX DOS

SIGSEGV, 无效的内存访问, 中止程序, UNIX DOS

SIGTERM, 中止信号, 中止程序, UNIX DOS

参数fname是一个指向函数的指针,当sig的信号发生时程序会自动中断转而执行fname指向的函数。执行完毕再返回断点继续执行程序。系统提供了两个常量函数指针,可以作为函数的参数传递。它们分别是:

  SIG_DEF:执行默认的系统第一的函数。

  SIG_IGN:忽略此信号。

  raise函数的作用是向正在执行的程序发送一个信号,从而使得当前进程产生一个中断而转向信号处理函数signal执行。其中参数sig为信号名称,它的取值范围同函数signal中的参数sig取值范围相同,见表9-6。

  下面通过例子理解函数signal和raise。

  例程9-2 signall和raise函数演示

#include <stdio.h>

#include <signal.h>

void Print1();

void Print2();

int main()

{ signal(SIGINT,Print1);

printf("Please enter Ctr c for interupt\n") ;

getchar();

signal(SIGSEGV,Print2);

printf("Please enter any key for a interupt\n");

getchar();

raise(SIGSEGV);

}

void Print1()

{

printf("This is a SIGINT interupt!\n");

}

void Print2()

{

printf("This is a SIGSEGV interupt!\n");

}

  本例程首先通过用户终端输入Ctrl c产生一个终端中断,然后应用signal函数调用中断处理函数Print1;再通过raise函数生成一个无效内存访问中断,并通过signal函数调用中断处理函数Print2。

  本例程的运行结果为:

Please enter Ctr c for interupt

^C

This is a SIGINT interupt!

Please enter any key for a interupt

a

This is a SIGSEGV interupt!

9. <stdarg.h>:可变参数表

  可变参数表<stdarg.h>中的宏是用来定义参数可变的函数的。在C语言中,有些库函数或者用户自定义的函数的参数是可变的,常用省略号"……"(例如库函数中的printf),定义这样的函数就要使用到<stdarg.h>中的宏。

  1、va_list

  用于保存宏va_start,va_arg以及va_end所需信息的数据类型。

  2、<stdarg.h>中还定义了三个宏

void va_start(va_list ap, parmN);

type va_arg(va_list ap,type);

void va_end (va_list ap);

  va_start的作用是初始化ap,因此va_start要在所有其它的va_开头的宏前面最先使用(除了用va_list定义变量外),后面的va_copy, va_arg, va_end都要使用到ap。在一对va_start和va_end之间不能再次使用va_start宏。其中,parmN 为"..."之前的最后一个参数。例如, printf函数定义为:printf(const char *format, ...); 那么在printf函数中的va_start使用之后, parmN 的值就等于*format。

  va_arg的作用就是返回参数列表ap中的下一个具有type类型的参数, 每次调用va_arg都会修改ap的值, 这样才能连续不断地获取下一个type类型的参数。

  va_end与va_start构成了一个scope,va_end标志着结束,va_end之后ap就无效了。

10. <stddef.h>:公共定义

在头文件<seddef.h>中,指定了标准库中的公共定义。其中主要包括以下内容:

1、NULL

空指针类型常量。

2、offset(type,member-designator)

  它是扩展iz-t类型的一个整型常数表达式。它的值为从type定义的结构类型的开头到结构成员member-designator的偏移字节数。

3、ptrdiff_t

  表示两指针之差的带符号整数类型。

4、size_t

  表示由sizeof运算符计算出的结果类型,它是一个无符号整数类型。

5、wchar_t

  它是一种整数类型,取值范围为在被支持的地域环境中最大扩展字符集的所有字符的各种代码,空字符代码值为0。

11. <stdio.h>:输入输出

  在头文件<stdio.h>中定义了输入输出函数,类型和宏。这些函数、类型和宏几乎占到标准库的三分之一。

  下面给出头文件<stdio.h>中声明的函数以及功能简介,见下表。

<stdio.h>中声明的函数

  函数定义, 函数功能简介

  FILE *fopen(char *filename, char *type), 打开一个文件

  FILE *fropen(char *filename, char *type,FILE *fp), 打开一个文件,并将该文件关联到fp指定的流

  int fflush(FILE *stream), 清除一个流

  int fclose(FILE *stream), 关闭一个文件

  int remove(char *filename), 删除一个文件

  int rename(char *oldname, char *newname), 重命名文件

  FILE *tmpfile(void), 以二进制方式打开暂存文件

  char *tmpnam(char *sptr), 创建一个唯一的文件名

  int setvbuf(FILE *stream, char *buf, int type, unsigned size), 把缓冲区与流相关

  int printf(char *format...), 产生格式化输出的函数

  int fprintf(FILE *stream, char *format[, argument,...]), 传送格式化输出到一个流中

  int scanf(char *format[,argument,...]), 执行格式化输入

  int fscanf(FILE *stream, char *format[,argument...]), 从一个流中执行格式化输入

  int fgetc(FILE *stream), 从流中读取字符

  char *fgets(char *string, int n, FILE *stream), 从流中读取一字符串

  int fputc(int ch, FILE *stream), 送一个字符到一个流中

  int fputs(char *string, FILE *stream), 送一个字符到一个流中

  int getc(FILE *stream), 从流中取字符

  int getchar(void), 从stdin流中读字符

  char *gets(char *string), 从流中取一字符串

  int putchar(int ch), 在stdout上输出字符

  int puts(char *string), 送一字符串到流中

  int ungetc(char c, FILE *stream), 把一个字符退回到输入流中

  int fread(void *ptr, int size, int nitems, FILE *stream), 从一个流中读数据

  int fwrite(void *ptr, int size, int nitems, FILE *stream), 写内容到流中

  int fseek(FILE *stream, long offset, int fromwhere), 重定位流上的文件指针

  long ftell(FILE *stream), 返回当前文件指针

  int rewind(FILE *stream), 将文件指针重新指向一个流的开头

  int fgetpos(FILE *stream), 取得当前文件的句柄

  int fsetpos(FILE *stream, const fpos_t *pos), 定位流上的文件指针

  void clearerr(FILE *stream), 复位错误标志

  int feof(FILE *stream), 检测流上的文件结束符

  int ferror(FILE *stream), 检测流上的错误

  void perror(char *string), 系统错误信息

  在头文件<stdio.h>中还定义了一些类型和宏。

  

12. <stdlib.h>:实用函数

  在头文件<stdlib.h>中声明了一些实现数值转换,内存分配等类似功能的函数。下面给出头文件<stdlib.h>中声明的函数以及功能简介,见下表。

<stdlib.h>中声明的函数

函数定义, 函数功能简介

double atof(const char *s), 将字符串s转换为double类型

int atoi(const char *s) , 将字符串s转换为int类型

long atol(const char *s), 将字符串s转换为long类型

double strtod (const char*s,char **endp) , 将字符串s前缀转换为double型

long strtol(const char*s,char **endp,int base), 将字符串s前缀转换为long型

unsinged long strtol(const char*s,char **endp,int base), 将字符串s前缀转换为unsinged long型

int rand(void), 产生一个0~RAND_MAX之间的伪随机数

void srand(unsigned int seed) , 初始化随机数发生器

void *calloc(size_t nelem, size_t elsize), 分配主存储器

void *malloc(unsigned size), 内存分配函数

void *realloc(void *ptr, unsigned newsize), 重新分配主存

void free(void *ptr), 释放已分配的块

void abort(void), 异常终止一个进程

void exit(int status), 终止应用程序

int atexit(atexit_t func), 注册终止函数

char *getenv(char *envvar), 从环境中取字符串

void *bsearch(const void *key, const void *base, size_t *nelem, size_t width, int(*fcmp)(const void *, const *)), 二分法搜索函数

void qsort(void *base, int nelem, int width, int (*fcmp)()), 使用快速排序例程进行排序

int abs(int i), 求整数的绝对值

long labs(long n), 取长整型绝对值

div_t div(int number, int denom), 将两个整数相除, 返回商和余数

ldiv_t ldiv(long lnumer, long ldenom), 两个长整型数相除, 返回商和余数

有关上面列出的这些标准实用函数的功能、用法、例程等。

  

13. <time.h>:日期与时间函数

  在头文件<time.h>中,声明了一些处理日期和时间的类型与函数。clock_t和time_t是两个表示时间值的算术类型。结构struct tm存储了一个日历时间的各个成分。结构tm的成员的意义及其正常的取值范围如下:

structtm{

inttm_sec;

inttm_min;

inttm_hour;

inttm_mday;

inttm_mon;

inttm_year;

inttm_wday;

inttm_yday;

inttm_isdst;

};

  如果夏令时有效,夏令时标记tm_isdst值为正;若夏令时无效,tm_isdst值为0;如果得不到夏令时信息,tm_isdst值为负。

  下面给出头文件<time.h>中声明的时间函数,见下表。

  <time.h>中声明的时间函数

  函数定义, 函数功能简介

  clock_t clock(void), 确定处理器时间函数

  time_t time(time_t *tp), 返回当前日历时间

  double difftime(time_t time2, time_t time1), 计算两个时刻之间的时间差

  time_t mktime(struct tm *tp), 将分段时间值转换为日历时间值

  char *asctime(const struct tm *tblock), 转换日期和时间为ASCII码

  char *ctime(const time_t *time), 把日期和时间转换为字符串

  struct tm *gmtime(const time_t *timer), 把日期和时间转换为格林尼治标准时间(GMT)

  struct tm *localtime(const time_t *timer), 把日期和时间转变为结构

  size_t strftime(char *s,size_t smax,const char *fmt, const struct tm *tp) , 根据fmt的格式要求将*tp中的日期与时间转换为指定格式。

  • 果冻到底是用什么做的(果冻是什么成分做出来的)
  • 2024-06-30果冻是什么成分做出来的果冻的主要成分有哪些果冻作为一种食物,在生活中主要借助水,糖分等等原料,额外添加了一种添加剂,从而制作成的食物虽说果冻美味可口,但是小伙伴们在制作果冻时,可能会在其添加果蔬,乳制品等等,额外还加入了溶。
  • 诺如病毒引起腹泻的特征(恶心呕吐腹痛和腹泻)
  • 2024-06-30恶心呕吐腹痛和腹泻又到“诺如病毒”肆虐时!它虽然有个好听的名字,但是病毒威力可不容小觑,它会引发感染性腹泻,带来腹痛、呕吐等一系列症状,并且没有疫苗和特效药物搞好个人卫生和饮食安全是预防本病的关键且听北京协和医院感染内。
  • 立冬诗句(关于立冬的诗句有哪些)
  • 2024-06-30关于立冬的诗句有哪些《立冬》【唐】李白冻笔新诗懒写,寒炉美酒时温醉看墨花月白,恍疑雪满前村《立冬日作》【宋】陆游室小财容膝,墙低仅及肩方过授衣月,又遇始裘天寸积篝炉炭,铢称布被绵平生师陋巷,随处一欣然《立冬前一日霜对菊有。
  • 女人如何提升气质(女人如何培养气质)
  • 2024-06-30女人如何培养气质1、塑造良好的体型,站一定要挺,所谓站有站相坐有坐相,抬头挺胸,尽量保持适中的身材,一个身材姣好的女性比起一个身材臃肿的女性更具信心和魅力!便可增加吸引力2、保持精致,学习基础的化妆,日常出门一定要记。
  • 僵尸毁灭工程等级怎么升(僵尸毁灭工程木工等级提升方法介绍)
  • 2024-06-30僵尸毁灭工程木工等级提升方法介绍《僵尸毁灭工程》中的木工等级是非常重要的,在制作拆除一些东西上很有用,但是很多玩家都不太清楚木工等级的提升方法是什么,其实想要提升木工的等级可以看书也可以看电视,木工杂志可以提升两级,不过只有一次,看。
  • 夜很深路很长(夜很深字很短情很长)
  • 2024-06-30夜很深字很短情很长不知道你有没有过这样的经历,喜欢在夜里分享歌曲,截屏歌词,和发表文字,却又在凌晨过后的深夜悄悄删除日子就像呼啸的列车飞驰而过,每个人都是彼此生命中的过客,每个人都很忙,除了住在心里的人,谁也没有更多的。
  • q版情侣绘画教程(如何绘制情侣的牵手)
  • 2024-06-30如何绘制情侣的牵手明天就是五一小长假了,节假日总会遇到各种情侣撒狗粮,为了提前帮你们适应一下,板君决定分享一组情侣姿势动作教程,让你们有对象,有依据,没对象的可练习!加油啊!即使放假了,基础也要练习啊!,。
  • 怎么防止水产寄生虫(加调料能杀死水产里的寄生虫)
  • 2024-06-30加调料能杀死水产里的寄生虫我们从小都被教育,肉啊鱼什么的不能吃生的,有虫子,脏不过当我们面对美味的生鱼片时,心理防线常常就失守了……“这蘸了芥末,寄生虫会被杀死”,要么就是“这用的是海鱼,海鱼没有寄生虫”,一边这样安慰自己,一。
  • 网飞版三体什么时候上映(三体网飞版即将上映)
  • 2024-06-30三体网飞版即将上映科幻电视剧《三体》的第一季已被网飞制作完成,根据中国科幻小说家刘慈欣的同名小说改编,计划于2024年1月播出剧情描述人类在与外星文明的初次接触后终于探索宇宙的未知领域该剧由著名《权力的游戏》创作团队执。
  • 老款汉兰达最佳改装(北京车友不甘平庸)
  • 2024-06-30北京车友不甘平庸 “本来没想买汉兰达的,因为我认为汉兰达比较适合中年人或者一些中规中矩的人,其实我自己很喜欢性能车,不过为了家庭的实用性还是选择了汉兰达15款4豪虽然买了汉兰达,但是我还是不甘心,也凭着这股劲儿造就了。
  • 朝阳沟豫剧演员现状(59年前豫剧朝阳沟8位演员近况)
  • 2024-06-3059年前豫剧朝阳沟8位演员近况《朝阳沟》是由河南豫剧院三团在1958年5月19日首演于郑州的,该剧1963年被长春电影制片厂搬上了荧幕豫剧《朝阳沟》在中国现代戏的历史上所具有的独特的品位和所拥有的特殊地位是无可争辩和替代的该剧讲述。
  • 睡觉是做梦多好还是不做梦好(睡觉到底是做梦好)
  • 2024-06-30睡觉到底是做梦好很多人总是觉得,经常做梦是睡眠不好的表现,总会羡慕那些从来不做梦、一觉睡到天亮的人,于是对做梦这件事很是排斥,甚至经常遭受噩梦的困扰,一觉醒来比没睡还累,看上去好像也没有什么失眠的大毛病,但就是觉得自。