C语言编程---类型转换和错误处理

类型转换

  • 小到大,自动转换;
  • 大到小,强制类型转换,会损失精度(舍弃小数);
// 小到大,自动转换
int a = 10;
double b = 21.5;
double c = a + b; // a自动转为double

//大到小,强制转换
int d = a + (int)b; // 31

// 强制转换
int a = 5;
int b = 10;
double c = (double) a / b; // 整数除以整数 得整数;强制类型转换  优于 除运算符

类型的自动转换(数据提升)
在这里插入图片描述
 

错误处理

  • 程序运行错误时,可以通过<errno.h>头文件获取错误码,errno变量获取;
  • errno错误码为int, 0 表示成功;
  • perror(“提示:”) 直接输出错误信息(字符串);
  • strerror(errno) 将错误码转为错误字符串;然后fprintf(stderr)
#include <stdio.h>
#include <errno.h>
#include <string.h>   //三个头文件必须包含
 
 
int main ()
{
    
    
   FILE * ptr;
   ptr = fopen ("lauf.txt", "rb");
   if (ptr == NULL)
   {
    
     // !pf
	  // 直接输出错误信息
	  perror("打开文件失败");

	  // 输出错误码
      fprintf(stderr, "错误号: %d\n", errno);
      // strerror 输出错误信息
      fprintf(stderr, "打开文件错误: %s\n", strerror( errnum ));
   }
   else
   {
    
    
      fclose (pf);
   }
   return 0;
}

零除的错误,自己判断除数是否为0即可;
使用exit(0),成功退出程序;
使用exit(-1),失败退出;

递归

  • 函数内部调用自身;
  • 须有明确的停止条件;
// 斐波那契数列
#include <stdio.h>
 
int fibonaci(int i)
{
    
    
   if(i == 0)
   {
    
    
      return 0;
   }
   if(i == 1)
   {
    
    
      return 1;
   }
   return fibonaci(i-1) + fibonaci(i-2);
}
 
int  main()
{
    
    
    int i;
    for (i = 0; i < 10; i++)
    {
    
    
       printf("%d\t\n", fibonaci(i));
    }
    return 0;
}

可变参数

  • 函数传参数时,个数不确定;
  • 使用<stdarg.h>头文件;
  • va_list 类型的变量,负责接收参数,形成参数列表;
  • va_start(va_list argList, int num); 为va_list类型的参数初始化num个参数的列表;
  • va_arg(va_list, type); 获取列表中的每一个参数,type为下一个参数的类型;
  • va_end(va_list argList); 释放argList的内存;

整型参数列表

#include <stdio.h>
#include <stdarg.h> // 必须使用该头文件
 
// 第一个参数为 可变参数的个数
// ... 表示可变参数列表
int lauf(int num, ...)
{
    
    
 	// 声明可变参数列表
    va_list argList;
    // 为 num 个参数初始化 argList 列表
    va_start(argList, num);
 	int arg;
    // 逐一打印参数
    for (i = 0; i < num; i++)
    {
    
    
       // 获取每一个参数
       arg = va_arg(argList, int); //下一个参数类型 根据实际情况决定
       printf("per arg: %d\n", arg);
    }
    // 清理为 argList 内存
    va_end(argList);
 
    return 0;
}
 
int main()
{
    
    
   printf("args of 2, 3, 4, 5 = %f\n", lauf(4, 2,3,4,5)); // 4个参数
   printf("args of 5, 10, 15 = %f\n", lauf(3, 5,10,15)); //3个参数
}

字符串参数列表

#include <stdarg.h>

int lauf1(int num, ...) {
    
    
	// 声明可变参数列表
	va_list argList;
	// 初始化
	va_start(argList, num);

	char* arg;

	for (int i = 0; i < num; i++) {
    
    
	
		arg = va_arg(argList, char*);
		printf("per arg: %s\n", arg);
	}
	// 释放内存
	va_end(argList);

	return 0;
}

int main() {
    
    
	
	lauf1(3, "tom", "jack", "lucy");
	
	system("pause");
	return 0;
}

 
 
[上一篇]:C语言编程—字符串与结构体
[下一篇]:C语言编程—内存管理和命令行参数

猜你喜欢

转载自blog.csdn.net/weixin_45228198/article/details/131864654