69,369
社区成员
发帖
与我相关
我的任务
分享
int myprintf(const int lensize,const char *fmt,... )
{ char *buff=NULL;
const int termsize =4;
va_list lst;
va_start (fmt,lst);
int n = vscprintf(fmt,lst);
buff =(char *) malloc ((n + termsize )* sizeof(char));
vsnprintf(buff,n,fmt,lst);
char *pcurr =buff,*pterm;
char swaper =0;
pterm =pcurr + linesize;
//每次取出linesize字节输出,最后不足linesize的单独输出,没有处理'\t'字符。
//为了节省复制数据的操作,下面取个巧
//数据分段输出,具体方法是每个linesize个字符,输出一次
//每次输出,在分段处做替换,过程如下
//保存要被替换的字符,字符替换成结束符,输出数据,字符替换回来。
while(pterm < buff+n)
{
swaper =*pterm; //保存,被替换的数据,,
*pterm = '\0'; //替换为结束符
printf("%s\n",pcurr);
*pterm= swaper; //替换回来
pcurr += linesize; //指针位置,增加linesize。
pterm += linesize; //
}
if(pcurr< pbuf + n )
printf("%s\n",pcurr);
free(pbuff);
va_end(lst);
}
Ps :
printf 替换为 a_debug 就差不多了。
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
typedef void (*line_callback)(const char *line, int bytes);
void printf_callback(const char *line, int bytes)
{
printf("%.*s\n", bytes, line);
}
int limited_printf(const char *fmt, int chars_per_line, line_callback cb, ...)
{
if (!fmt || !cb || chars_per_line <= 0)
return -1;
va_list ap;
va_start(ap, cb);
char minimal[1024];
char *buf = minimal;
int size = sizeof(minimal);
int ret = vsnprintf(buf, size, fmt, ap);
if (ret >= sizeof(minimal))
{
size = ret + 1;
buf = malloc(size);
ret = vsnprintf(buf, size, fmt, ap);
}
int i;
for (i = 0; i < ret; i += chars_per_line)
cb(buf + i, ret - i >= chars_per_line ? chars_per_line : ret - i);
if (size != sizeof(minimal))
free(buf);
return 0;
}
int main(int argc, char *argv[])
{
limited_printf("%s", 2, printf_callback, "1234567");
return 0;
}