C复习手记(Day4)
2015-10-26 13:43
141 查看
1、C错误处理
errno、perror()和sterror()
perror()函数显示您传给它的字符串,后跟一个冒号、一个空格和当前errno值的文本表示形式。
strerror()函数,返回一个指针,指针指向当前errno值的文本表示形式。
被零除的错误
程序退出状态
通常情况下,程序成功执行完一个操作正常退出的时候会带有值EXIT_SUCCESS。在这里,EXIT_SUCCESS是宏,它被定义为0。如果程序中存在一种错误情况,当您退出程序时,会带有状态值EXIT_FAILURE,被定义为-1。
2、C递归
数的阶乘
斐波那契数列
需要使用stdarg.h头文件,该文件提供了实现可变参数功能的函数和宏。具体步骤如下:
定义一个函数,最后一个参数为省略号,省略号前面的那个参数总是int,表示了参数的个数。
在函数定义中创建一个va_list类型变量,该类型是在stdarg.h头文件中定义的。
使用int参数和va_start宏来初始化va_list变量为一个参数列表。宏va_start是在stdarg.h头文件中定义的。
使用va_arg宏和va_list变量来访问参数列表中的每个项。
使用宏va_end来清理赋予va_list变量的内存。
/*为num个参数初始化valist*/va_start
/*访问所有赋给valist的参数*/
va_arg
/*清理为valist保留的内存*/
4、内存管理
内存管理函数
动态分配内存
预先不知道需要存储的文本长度,需要定义一个指针,该指针指向未定义所学内存大小的字符,后续再根据需求来分配内存。
执行程序时,可以从命令行传值给C程序。这些值被称为命令行参数,它们对程序很重要,特别是当你想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了
命令行参数是使用main()函数参数来处理的,其中,argc是指传入参数的个数,argv[]是一个指针数组,指向传递给程序的每个参数。
使用一个参数,编译并执行上面的代码,它会产生下列结果:
Theargumentsuppliedistesting
使用两个参数,编译并执行上面的代码,它会产生下列结果:
Toomanyargumentssupplied.
不传任何参数,编译并执行上面的代码,它会产生下列结果:
Oneargumentexpectedargv[0]存储程序的名称,argv[1]是一个指向第一个命令行参数的指针,*argv
是最后一个参数。如果没有提供任何参数,argc将为1,否则,如果传递了一个参数,argc将被设置为2。
多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号""或单引号''内部
errno、perror()和sterror()
perror()函数显示您传给它的字符串,后跟一个冒号、一个空格和当前errno值的文本表示形式。
strerror()函数,返回一个指针,指针指向当前errno值的文本表示形式。
被零除的错误
程序退出状态
通常情况下,程序成功执行完一个操作正常退出的时候会带有值EXIT_SUCCESS。在这里,EXIT_SUCCESS是宏,它被定义为0。如果程序中存在一种错误情况,当您退出程序时,会带有状态值EXIT_FAILURE,被定义为-1。
2、C递归
数的阶乘
intfactorial(unsignedinti) { if(i<=1) { return1; } returni*factorial(i-1); }
斐波那契数列
intfibonaci(inti) { if(i==0) { return0; } if(i==1) { return1; } returnfibonaci(i-1)+fibonaci(i-2); }
3、可变参数
需要使用stdarg.h头文件,该文件提供了实现可变参数功能的函数和宏。具体步骤如下:
定义一个函数,最后一个参数为省略号,省略号前面的那个参数总是int,表示了参数的个数。
在函数定义中创建一个va_list类型变量,该类型是在stdarg.h头文件中定义的。
使用int参数和va_start宏来初始化va_list变量为一个参数列表。宏va_start是在stdarg.h头文件中定义的。
使用va_arg宏和va_list变量来访问参数列表中的每个项。
使用宏va_end来清理赋予va_list变量的内存。
#include<stdio.h> #include<stdarg.h> doubleaverage(intnum,...) { va_listvalist; doublesum=0.0; inti;
/*为num个参数初始化valist*/va_start
(valist,num);
/*访问所有赋给valist的参数*/
for(i=0;i<num;i++) { sum+=
va_arg
(valist,int); }
/*清理为valist保留的内存*/
va_end(valist); returnsum/num; } intmain() { printf("Averageof2,3,4,5=%f\n",average(4,2,3,4,5)); printf("Averageof5,10,15=%f\n",average(3,5,10,15)); }
4、内存管理
内存管理函数
函数 | 描述 |
void*calloc(intnum,intsize) | 该函数分配一个带有functionallocatesanarrayofnum个元素的数组,每个元素的大小为size字节。 |
voidfree(void*adress) | 该函数释放address所指向的h内存块。 |
void*malloc(intnum) | 该函数分配一个num字节的数组,并初始化 |
void*realloc(void*adress,intnewsize) | 该函数重新分配内存,把内存扩展到newsize |
预先不知道需要存储的文本长度,需要定义一个指针,该指针指向未定义所学内存大小的字符,后续再根据需求来分配内存。
…char*description;
description=malloc(200*sizeof(char));…
5、命令行参数
执行程序时,可以从命令行传值给C程序。这些值被称为命令行参数,它们对程序很重要,特别是当你想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了
命令行参数是使用main()函数参数来处理的,其中,argc是指传入参数的个数,argv[]是一个指针数组,指向传递给程序的每个参数。
intmain(intargc,char*argv[])
{
if(argc==2)
{
printf("Theargumentsuppliedis%s\n",argv[1]);
}
elseif(argc>2)
{
printf("Toomanyargumentssupplied.\n");
}
else
{
printf("Oneargumentexpected.\n");
}
}
使用一个参数,编译并执行上面的代码,它会产生下列结果:
Theargumentsuppliedistesting
使用两个参数,编译并执行上面的代码,它会产生下列结果:
Toomanyargumentssupplied.
不传任何参数,编译并执行上面的代码,它会产生下列结果:
Oneargumentexpectedargv[0]存储程序的名称,argv[1]是一个指向第一个命令行参数的指针,*argv
是最后一个参数。如果没有提供任何参数,argc将为1,否则,如果传递了一个参数,argc将被设置为2。
多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号""或单引号''内部
相关文章推荐
- array数组函数
- 深入理解linux的权限设置和SUID,SGID以及粘滞位
- 有Power也有Point的PowerPoint
- windows/linux下查看端口
- android 随机数Random
- 修改控制台的字体
- MUI-图片轮播控件
- 本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑ i=0 n (a[i]×x i ) 在x点的值。
- IOS--控件UITableView详解
- 对中国90后及00后“深入骨髓”的剖析
- 系统集成知识点整理(十)信息(文档)和配置管理
- JSP与Servlet
- idea
- 10.24作业
- mybatis返回map类型数据空值字段不显示
- Robot Framework自动化测试(一)---第一个脚本(转)
- 如果你要拍一部微电影
- Android屏幕适配全攻略(最权威的官方适配指导)
- SAP QM 取消UD方法
- 实现TextView的添加图片的功能