扩展欧几里得结尾
------------------------------------------------
变参函数:
实现可变参数max_int,从若干个传入的参数中返回最大值。
int max_int(int a, ...);
... 是变参列表,不能通过名字定位变量。
变参函数最起码有一个参数的名字是已知的
需要stdarg.h
如何获得a往后的参数列表?
va_list类型的变量
如何定位a后面一个参数的位置?
va_start(va_list类型变量, 已知名字参数)宏
如何获取下一个va_list中的参数?
while (n--) {
va_arg(va_list类型变量, 数据类型)宏
}
如何结束整个获取可变参列表的动作?
va_end(va_list类型变量)宏
(函数不能传入int数据类型,所以是宏)
#include <stdio.h>
#include <inttypes.h>
#include <stdarg.h>
#define P(func) {\
printf("%s = %d\n", #func, func);\
}
int max_int(int n, ...) {
int ans = INT32_MIN; //inttypes.h中直接获取int的最小值
va_list arg;
va_start(arg, n);
while (n--) {
int tmp = va_arg(arg, int);
if (tmp > ans) ans = tmp;
}
va_end(arg);
return ans;
}
int main() {
P(max_int(3, 1, 2, 3));
P(max_int(5, 1, 3, 5, 23, 4));
P(max_int(4, 3, 1, 2, 5, 123, 1245));
return 0;
}
------------------------------------------------
实现简版的printf() 函数:
首先能输出: putchar() 每次向屏幕当中打印1个字符 (与getchar() 是一家)。printf底层是putchar封装的。
printf支持的操作:
①打印一个字符串
②取参数%d %c %s等等
#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>
#define swap(a, b) a^=b, b^=a, a^=b
int my_printf(const char *frm, ...) {
int cnt = 0;
va_list arg;
va_start(arg, frm);
#define PUTC(x) putchar(x), ++cnt
for (int i = 0; frm[i]; i++) {
switch (frm[i]) {
case '%': {
switch (frm[++i]) {
case '%': PUTC(frm[i]); break;
case 'c': {
uint8_t ch = va_arg(arg, int);
PUTC(ch);
} break;
case 'd': {
int tmp = va_arg(arg, int);
uint32_t x;
if (tmp < 0) PUTC('-'), x = -tmp;
else x = tmp;
int arr[11] = {'0'};
int dig = 0;
for (int i = 0; x || x % 10; i++, x /= 10) {
arr[i] = x % 10 + '0', dig++;
}
for (int i = 0; i < dig / 2; i++) {
swap(arr[i], arr[dig - 1 - i]);
}
for (int i = 0; arr[i]; i++) {
PUTC(arr[i]);
}
} break;
case 's': {
const char *str = va_arg(arg, const char *);
for (int i = 0; str[i]; i++) {
PUTC(str[i]);
}
} break;
}
} break;
default: PUTC(frm[i]); // 直接输出%
}
}
#undef PUTC
va_end(arg);
return cnt;
}
int main() {
my_printf("hello world\n");
my_printf("int (123) = %d\n", 123);
my_printf("int (0) = %d\n", 0);
my_printf("int (1000) = %d\n", 1000);
my_printf("int (-123) = %d\n", -123);
my_printf("INT32_MAX = %d\n", INT32_MAX);
my_printf("INT32_MIN = %d\n", INT32_MIN);
my_printf("test_str = %s\n", "FUCK!");
my_printf("int (190000001) = %d\n", 190000001);
my_printf("char (%%) = %c\n", '%');
return 0;
}