默认计划
491人加入学习
(0人评价)
【研发工程师】C语言程序设计
价格 ¥ 970.00
该课程属于 名企研发核心能力课 请加入后再学习

扩展欧几里得结尾

------------------------------------------------

变参函数

实现可变参数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;
}

 

 

[展开全文]

变参函数:

  int max_int(int a, ...);

   va_list类型的变量 获得a往后的参数列表;va_start函数定位a后面第一个参数的位置;va_arg函数结束整个获取下个可变参数列表中的参数;va_end结束整个获取可变参数列表的动作;

#include <stdio>
#include <inttypes.h>
#include <stdarg.h>

#define P(func) { \
  printf("%s = %d\n", #func, func); \ 
}

int max_int(int n, ...) {
  int ans = INT32_MIN;
  va_list = arg;
  var_start(arg, n);
  while (n--) {
    int temp = var_arg(arg, int);
    if (temp > ans) ans = temp;
  }
  va_end(arg);
  return ans;
 
}
int main() {
  P(max_int(3, 1, 2, 4));
  P(max_int(3, 3, 1, 5, 6);
  

  return 0;
}

  

#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>

int reverse_num(int n, int *temp) {
  int digit = 0;
  do {
    *temp = *temp * 10 + n % 10;
    digit += 1;
    n /= 10;
  } while (n);
  return digit;
}

int output_num(int n, int digit) {
  int cnt = 0;
  while (digit--) {
    putchar(n % 10 + '0');
    cnt += 1;
    n /= 10;
  }
  return cnt;
}

int my_printf(const char *frm, ...) {
  int cnt = 0;
  va_list arg;
  va_start(arg, frm);
  #define PUTC(a) putchar(a), ++cnt
  for (int i = 0; frm[i]; i++) {
    switch(frm[i]) {
      case '%': {
        switch(frm[++i]) {
          case '%': PUTC(frm[i]); break;
          case 'd': {
               int x = var_arg(arg, int);
               uint32_t xx = 0;
               if (x < 0) PUTC('-'), xx = -x;
               else xx = x;
               int x1 = xx / 100000, x2 = xx % 100000;
               int temp1 = 0, temp2 = 0;
               int digit1 = reverse_num(x1, &temp1);
               int digit2 = reverse_num(x2, &temp2);
               if(x1) digit2 = 5;
               else digit1 = 0;
               cnt += output_num(temp1, digit1);
               cnt += output_num(temp2, digit2);
             } break;
             case 's': {
               const char *str = va_arg(arg, const string);
               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() {
  printf("hello word\n");
  my_printf("hello word\n");
  printf("int(1000) = %d\n", 1000);
  my_printf("int(1000) = %d\n", 1000);
  printf("int(19000001) = %d\n", 19000001);
  my_printf("int(19000001) = %d\n", 19000001);
  return 0;
}

 

[展开全文]

授课教师

C++算法工程师

课程特色

视频(31)