[英]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.