簡體   English   中英

如何使用變量或重復的占位符在C中構造格式字符串?

[英]How to construct a format string in C with a variable or repeating number of placeholders?

我想編寫一個hexdump函數。 因此,我想將sprintf與格式字符串一起使用

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

然后將此字符串與printf()中的字符(或字節)一起使用。

但是,我希望用戶指定行寬,即每行要轉儲的字節數。

如何構造具有給定寬度的格式字符串,即寬度2導致格式字符串為"%c %c 0x%02X 0x%02X" ...

我建議這樣做:

我建議這樣做:

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

與其使用sprintf()構造格式字符串sprintf()僅在以后與printf()一起使用printf()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恆定。 此外,輸出已正確對齊。

構造這樣的格式字符串相當容易。

但是,問題是使用該格式調用sprintf <stdio.h>沒有可讓您傳遞參數數組的函數。 標准C中的每個printf變體都要求您在編譯時決定參數數量

盡管可以傳遞較少的參數,但對於組合的十六進制顯示(例如

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

很快就會變得很乏味。

不幸的是,沒有簡單的出路-您需要編寫自己的sprintf變體,或者使用循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM