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

时间:2017-12-14 21:57:43

标签: c printf

请考虑以下代码:

#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("");
}

- 假设函数printStrGenericprintNumGeneric几乎相同(printf字母除外),我想知道是否有任何可能只有1个函数,并将printf字母(%c%d)作为参数传递给函数?

2 个答案:

答案 0 :(得分:2)

将格式说明符作为参数传递是一种方法,就像@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("");
}

答案 1 :(得分:2)

了解使用:

  1. va_args

  2. 语法:format,...

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

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