您的位置:首页 > 其它

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递归

数的阶乘

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。

多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号""或单引号''内部
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: