C复习手记(Day4)

it2024-10-16  14

1、C错误处理

errno、perror() 和sterror()

perror() 函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。

strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。

被零除的错误

程序退出状态

通常情况下,程序成功执行完一个操作正常退出的时候会带有值 EXIT_SUCCESS。在这里,EXIT_SUCCESS 是宏,它被定义为 0。如果程序中存在一种错误情况,当您退出程序时,会带有状态值 EXIT_FAILURE,被定义为 -1。


2、C递归

数的阶乘

int factorial(unsigned int i) { if(i <= 1) { return 1; } return i * factorial(i - 1); }

斐波那契数列

int fibonaci(int i) { if(i == 0) { return 0; } if(i == 1) { return 1; } return fibonaci(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> double average(int num,...) { va_list valist; double sum = 0.0; int i;

/* 为 num 个参数初始化 valist */ va_start

(valist, num);

/* 访问所有赋给 valist 的参数 */

for (i = 0; i < num; i++) { sum +=

va_arg

(valist, int); }

/* 清理为 valist 保留的内存 */

va_end(valist); return sum/num; } int main() { printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5)); printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15)); }

4、内存管理

内存管理函数

函数描述void *calloc(int num,int size)该函数分配一个带有 function allocates an array of num 个元素的数组,每个元素的大小为 size 字节。void free(void *adress)该函数释放 address 所指向的h内存块。void *malloc(int num)该函数分配一个num字节的数组,并初始化void *realloc(void *adress,int newsize)该函数重新分配内存,把内存扩展到newsize

动态分配内存

预先不知道需要存储的文本长度,需要定义一个指针,该指针指向未定义所学内存大小的字符,后续再根据需求来分配内存。

…char *description; description = malloc( 200 * sizeof(char) );… 5、命令行参数  

执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当你想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了

命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。

int main( int argc, char *argv[] ) { if( argc == 2 ) { printf("The argument supplied is %s\n", argv[1]); } else if( argc > 2 ) { printf("Too many arguments supplied.\n"); } else { printf("One argument expected.\n"); } }

使用一个参数,编译并执行上面的代码,它会产生下列结果:

The argument supplied is testing

使用两个参数,编译并执行上面的代码,它会产生下列结果:

Too many arguments supplied.

不传任何参数,编译并执行上面的代码,它会产生下列结果:

One argument expectedargv[0] 存储程序的名称,argv[1] 是一个指向第一个命令行参数的指针,*argv[n] 是最后一个参数。如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc 将被设置为 2。

多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 "" 或单引号 '' 内部

转载于:https://www.cnblogs.com/wrs9527/p/4910965.html

相关资源:匠人手记-完整版.zip
最新回复(0)