自己实现sprintf功能:
关于C中的系统函数sprintf在上次【https://www.cnblogs.com/webor2006/p/7545627.html】学习中已经用到过了,这里再来回顾一下:
而为了巩固学习咱们可以用之前所学的可变参数【https://www.cnblogs.com/webor2006/p/9499213.html】、指针等知识实现类似的功能,自己实现一个只考虑传整型参数的情况就成,那如何来实现呢?下面开始:
如果遇到了“%”,则需要判断一下它的下一位字符是否是“d”字符,只有这样才是一个合法的占位,所以:
然后如果发现此参数是一个负数,则需要前面手动加一个“-”,如下:
然后再将解析到的字符串参数遍历到结果串当中,如下:
下面使用一下咱们自己编写的函数看下效果:
原来是少了这么一句关键逻辑,如下:
// // Created by xiongwei on 2018/9/23. // #ifndef LSN3_EXAMPLE_MYSPRINTF_H #define LSN3_EXAMPLE_MYSPRINTF_H #include <stdarg.h>//用来获取可变参数 void mysprintf(char *buffer, const char *fmt, ...) { //首先声明va_list va_list arg_list; va_start(arg_list, buffer); char *b = buffer; int count = 0;//用来记录总格式化字符的总个数,因为需要给结果字串最后位置添加一个' ' while (*fmt)//一个个格式字串字符进行遍历判断,如果字符串遍历完,其整个逻辑也就处理完了 { if (*fmt != '%') {//如果格式字符中木有遇到"%"的占位符,则将相应的字节拷贝到buffer当中 count++; *b++ = *fmt++; continue; } fmt++; switch (*fmt) { case 'd': { int i = va_arg(arg_list, int);//获得一个可变参数 int j = 0; char tmp[10];//将可变参数一个个字节存放在此临时变量中 int sign = i < 0 ? 1 :0; do { //i = 888 //取出最后一个数字 int r = i % 10; r = r < 0 ? -r : r; //去掉最后一个数字 //将其数值转换成字符记录一下 tmp[j++] = r + '0'; } while (i /= 10); //tmp = 888 // i= -123 tmp = 321- if (sign) {//负数参数处理 tmp[j++] = '-'; } while (j>0) { char a = tmp[--j]; *b++ = a; count++; } } break; } fmt++; } buffer[count] = '