码迷,mamicode.com
首页 > 其他好文 > 详细

C复习手记(Day4)

时间:2015-10-26 15:04:10      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

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。

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

C复习手记(Day4)

标签:

原文地址:http://www.cnblogs.com/wrs9527/p/4910965.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!