引言
这是关于C中如何使用异常机制的讨论.顺带讲一讲C中魔法函数的setjmp内部机制.
通过它实现高级的异常try...catch. 允许我先扯一段面试题. 对于计算机面试题. 算法题等.觉得还是有意义的.
在你封装基础库的时候会简单用的.因为大家都会得你也会那是及格.如果你想及格+1的话...
开始吧,题目是这样的
/* * 面试问题 假如有数组 int a[] = {1,2,3,4,5,6,7}, n = 7表示长度, k = 2表示移动步长 * 移动结果变成 1234567=> 6712345. * 同样假如 k=3移动三步 1234567=> 5671234 * 实现一个移动函数 * void convert(int a[], int n, int k); */
的时候基本基本说算法. 这里主要想通过这个问题引导异常机制上来.直接贴代码
// 数组移动函数 void convert(int a[], int n, int k) { int t=1, i, j;// t是为了数据记录终止条件的 // 前面两个是没有移动的必要, 后面是已经整除形成周期了也不需要移动 if ((!a) || (n <= 1) || !(k %= n)) return; // 计算最优的k和n k = k < 0 ? k + n : k; // 开始真的移动了, 首先确定趟数, 一般趟就够了,特殊的就是能够整除的需要多趟 for (i = 0; t<n && i < k; ++i) { //开始循环了, 结束条件式循环到头了 for (j = (i + k) % n; j != i; j = (j + k) % n) { ++t; int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } }
关于上面
// 前面两个是没有移动的必要, 后面是已经整除形成周期了也不需要移动 if ((!a) || (n <= 1) || !(k %= n)) return;
就是C中最简单的异常机制听过事先 if判断条件达到异常应对作用. 应该是最简单的异常处理, 也是常用的一种方式.
附录完整的测试demo.c
#include <stdio.h> #include <stdlib.h> // 数组打印函数 void aprint(int a[], int n); // 数组移动函数 void convert(int a[], int n, int k); //添加一个数组打印宏, a只能是数组 #define ALEN(a) \ sizeof(a)/sizeof(*a) #define APRINT(a) \ aprint(a, ALEN(a)) /* * 面试问题 假如有数组 int a[] = {1,2,3,4,5,6,7}, n = 7表示长度, k = 2表示移动步长 * 移动结果变成 1234567=> 6712345. * 同样假如 k=3移动三步 1234567=> 5671234 * 实现一个移动函数 * void convert(int a[], int n, int k); */ int main(int argc, char* argv[]) { // 实现主体逻辑 int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; APRINT(a); convert(a, ALEN(a), 4); APRINT(a); convert(a, ALEN(a), -4); APRINT(a); return system("pause"); } // 数组打印函数 void aprint(int a[], int n) { int i = -1; printf("now data: "); while (++i < n) printf("%d", a[i]); putchar('\n'); } // 数组移动函数 void convert(int a[], int n, int k) { int t=1, i, j;// t是为了数据记录终止条件的 // 前面两个是没有移动的必要, 后面是已经整除形成周期了也不需要移动 if ((!a) || (n <= 1) || !(k %= n)) return; // 计算最优的k和n k = k < 0 ? k + n : k; // 开始真的移动了, 首先确定趟数, 一般趟就够了,特殊的就是能够整除的需要多趟 for (i = 0; t<n && i < k; ++i) { //开始循环了, 结束条件式循环到头了 for (j = (i + k) % n; j != i; j = (j + k) % n) { ++t; int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } }