C语言, vsnprintf 打印方法

tanlekwei 2013-10-01 02:47:25
我用vsnprintf打印错误信息,但是我只能在每一行打印24个char.
每次打印到第24个, 信息就会停了。
现在我想接下去把第24个char之后的信息打印在新的一行,我能怎样做呢?

va_list args;
#define length 100
char debug[length];
if ( length < 23)
{
va_start(args, fmt);
vsnprintf(debug, length, fmt, args);
a_debug(devh,debug);
va_end(args);
}

else
{
//我应该怎样做呢?
}
...全文
339 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-10-04
  • 打赏
  • 举报
回复
这个问题有两个解决方案,第一个难度比较大,就是自己解释格式,自己输出,够24个换行继续输出。 //第二个,把所有数据输出到字符数组中,每次截取lensize个输出 //每行只打印lensize 个字符
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 就差不多了。
qq120848369 2013-10-04
  • 打赏
  • 举报
回复
熟悉vsnprintf的返回值,你才能写出正确的程序,兼具效率与灵活性,选一个折衷方案:
#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;
}
tanlekwei 2013-10-02
  • 打赏
  • 举报
回复
引用 4 楼 missheaven2011 的回复:
对debug进行打印啊,24字节打印一下,人为控制下应该就可以了
怎样人为控制呢??
AnYidan 2013-10-01
  • 打赏
  • 举报
回复
http://pic.dhe.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Frtref%2Fvsnprintf.htm
missheaven2011 2013-10-01
  • 打赏
  • 举报
回复
对debug进行打印啊,24字节打印一下,人为控制下应该就可以了
davidyu720 2013-10-01
  • 打赏
  • 举报
回复
没有完全明白。 a_debug() 是什么函数?不支持多行输出吗?
tanlekwei 2013-10-01
  • 打赏
  • 举报
回复
引用 1 楼 N_sev7 的回复:
int vsnprintf(char *str, size_t size, const char *format, va_list ap); 参数说明: char *str [out],把生成的格式化的字符串存放在这里. size_t size [in], buffer可接受的最大字节数,防止产生数组越界. const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。 va_list ap [in], va_list变量. va:variable-argument:可变参数
然后呢?
N_Sev7 2013-10-01
  • 打赏
  • 举报
回复
int vsnprintf(char *str, size_t size, const char *format, va_list ap); 参数说明: char *str [out],把生成的格式化的字符串存放在这里. size_t size [in], buffer可接受的最大字节数,防止产生数组越界. const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。 va_list ap [in], va_list变量. va:variable-argument:可变参数

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧