如何使用可变或重复的占位符数在C中构造格式字符串?

时间:2017-07-31 09:39:20

标签: c

我想写一个hexdump函数。因此,我想使用带有格式字符串的sprintf,如

"%c %c %c %c 0x%02X 0x%02X 0x%02X 0x%02X"

然后在printf()中使用带有字符(或字节)的字符串。

但是,我希望用户指定行宽,即每行要转储的字节数。

如何构造具有给定宽度的格式字符串,即宽度为2会导致格式字符串为"%c %c 0x%02X 0x%02X" ...

3 个答案:

答案 0 :(得分:1)

我建议这样做:

我建议这样做:

void writeIntegersAsChar(char* str, int* source, int N)
{
    int i;
    for(i = 0; i < N; i ++)
    {
        sprintf(str + i, "%c", source[i]);
    }
}

答案 1 :(得分:1)

不要使用sprintf()构建格式字符串,而只是稍后使用printf(),请考虑以下方法(基本上)对输入字符串进行两次传递:

void hex_dump(char *bytes, size_t bytes_len)
{
    const int DUMP_WIDTH = 16;

    for (int i = 0; i < bytes_len; i += DUMP_WIDTH)
    {
        for (int j = 0; j < DUMP_WIDTH; ++j)
        {
            if (i + j >= bytes_len) {
                printf(" ");
                continue;
            }
            char ch = bytes[i + j];
            if (isprint(ch))
            {
                printf("%c", ch);
            }
            else
            {
                printf(".");
            }
        }
        printf("   ");
        for (int j = 0; j < DUMP_WIDTH && i + j < bytes_len; ++j)
        {
            printf("0x%02x", bytes[i + j]);
            printf(" "); 
        }
        printf("\n");
    }
}

该函数将输出hexdump - 类似于DUMP_WIDTH常量控制的输出。此外,输出正确对齐。

答案 2 :(得分:1)

构造这样的格式字符串相当容易。

然而,问题是使用该格式调用sprintf <stdio.h>中没有允许您传入数组参数的函数。标准C中的每个printf变体都要求您在编译时决定参数的数量

虽然可以传入 less 参数,但它并不能帮助您使用组合的十六进制显示,例如

"%c %c %c %c  0x%02X 0x%02X 0x%02X 0x%02X"

很快就会变得乏味。

不幸的是,没有简单的方法 - 您需要编写自己的 sprintf 变体,或者使用循环代替。