代码之家  ›  专栏  ›  技术社区  ›  wintermute

是否有方法将printf字母(%c,%d)作为函数参数传递?

  •  1
  • wintermute  · 技术社区  · 7 年前

    请考虑以下代码:

    #include <stdio.h>
    
    void printStrGeneric(void *, int, int);
    void printNumGeneric(void *, int, int);
    
    int main()
    {
    
        int intArray[] = { 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85 };
    
        printNumGeneric(intArray, sizeof(intArray), sizeof(int));
        printStrGeneric(intArray, sizeof(intArray), sizeof(int));
        puts("");
    
        short shortArray[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 };
    
        printNumGeneric(shortArray, sizeof(shortArray), sizeof(short));
        printStrGeneric(shortArray, sizeof(shortArray), sizeof(short));
        puts("");
    
        return 0;
    }
    
    void printStrGeneric(void *object, int size, int elem_size)
    {
        char *p = (char *) object;
        while (p < (char *) object + size) {
            printf("%c\t", *p);
            p += elem_size;
        }
        puts("");
    }
    
    void printNumGeneric(void *object, int size, int elem_size)
    {
        char *p = (char *) object;
        while (p < (char *) object + size) {
            printf("%d\t", *p);
            p += elem_size;
        }
        puts("");
    }
    

    考虑到功能 printStrGeneric printNumGeneric 几乎相同(除了 printf 字母),我想知道是否有可能只使用1个函数,并传递 打印F 字母(或 %c %d )将函数作为参数?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Idan    7 年前

    了解以下各项的用法:

    1. va\U参数

    2. 语法:format。。。

    两者的结合允许您将格式传递给函数,并根据需要进行处理。

    这是一个非常简单的解释: https://www.eskimo.com/~scs/cclass/int/sx11b.html

        2
  •  2
  •   Saravana Kumar Prashant Shete    7 年前

    将格式说明符作为参数传递是一种类似于@OldProgrammer的方法,但正如@0x5453所指出的,它可能是一个漏洞。

    您是否反对将bool值作为额外参数传递,并使用if条件控制printf函数?因此,您的代码如下所示:

    void printGeneric(void *object, int size, int elem_size, bool str)
    {
        char *p = (char *) object;
        if(str){
            while (p < (char *) object + size) {
                printf("%c\t", *p);
                p += elem_size;
            }
        }else{
            while (p < (char *) object + size) {
                printf("%d\t", *p);
                p += elem_size;
            } 
        }
        puts("");
    }