我是靠谱客的博主 繁荣荔枝,最近开发中收集的这篇文章主要介绍变长参数列表的转义字符处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C语言使用stdarg.h中有一些处理变长参数的宏,va_start、va_list、va_end...在进行日志处理时,这个变长参数列表很好用,类似printf的函数原型。
以前一直使用得很好的,最近在记录url的时候出现了问题,url中会有一些使用%转义多字节字符(中文汉字等)的情况,将这些参数送进去程序会出现异常。 但是使用printf是没有问题的。

以下是我的问题代码及相关输出结果

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>

#ifdef LOGDEBUG
#define LOGFILE_NAME "logtest.log"
FILE* LOGFILE;
void LOGON() {
    LOGFILE=fopen(LOGFILE_NAME,"a+");
}
void LOG(const char* format,...) {
    va_list list;
    time_t t=time(NULL);
    tm* tp=localtime(&t);
    char log_spin[256]="";
    char log_buffer[1024*4]="";
    
    if(format==NULL||!LOGFILE) return;
    
    sprintf(log_spin,"[%04d-%02d-%02d %02d:%02d:%02d]",
            tp->tm_year+1900,tp->tm_mon+1,tp->tm_mday,
            tp->tm_hour,tp->tm_min,tp->tm_sec);
    strcpy(log_buffer,log_spin);
    size_t occuppied=strlen(log_buffer);
    size_t remain=sizeof(log_buffer)-occuppied;
    int count=0;
    
    va_start(list,format);
    count=vsnprintf(&log_buffer[strlen(log_buffer)],remain,format,list);
    va_end(list);
    
    //隐患,如果参数长度超长,函数会bug.
    if(count>=remain) sprintf(&log_buffer[sizeof(log_buffer)-5],"...n");
    else log_buffer[strlen(log_buffer)]='n';
    
    fprintf(LOGFILE,log_buffer);
    fflush(LOGFILE);
}
void LOGOFF() {
    LOG("Exit!nnn");
    if(LOGFILE) fclose(LOGFILE);
}

void test() {
    FILE* file=NULL;
    int length=0;
    char* mem=NULL;

#define TEST_FILENAME "转义文件"    
    file=fopen(TEST_FILENAME,"rb");
    if(!file) return;
    
    fseek(file,0,SEEK_END);
    length=ftell(file);
    
    mem=(char*)calloc(sizeof(char)*(length+1),1);
    if(!mem) {
        fclose(file);
        return;
    }
    
    fseek(file,0,SEEK_SET);
    fread(mem,length,1,file);
    
    fclose(file);
    
    printf("%sn",mem);
    LOG("%s:%s",__FUNCTION__,mem);
    
    if(mem) free(mem);
    
    return;
}

void main() {
    char msg[256]="%7B";//"";
    LOGON();
    LOG("%s:%s",__FUNCTION__,msg);   
    test();
    LOGOFF();
    printf("Exit.n");
}
#endif

测试文件内容如下:

输出结果如下:

日志文件如下:

可以看到,日志文件并没有正常输出转义文件的内容。

最后

以上就是繁荣荔枝为你收集整理的变长参数列表的转义字符处理的全部内容,希望文章能够帮你解决变长参数列表的转义字符处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部