2017-07-31 62 views
0

我想寫一個hexdump函數。因此,我想用sprintf與格式字符串像如何使用變量或重複數量的佔位符在C中構造格式字符串?

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

,然後用這個字符串在printf的字符(或字節)()。

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

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

+2

選擇一種語言,C和C++是具有類似syntex的不同語言。 – Sma

+0

我只限於C,謝謝@Sma。 – Shuzheng

+0

@Sma我不認爲這是一個有效的反對意見。 OP希望使用'sprintf()',這是一種兩種語言都相同的函數; C++只是用名稱空間和其他必需的小改動導入C頭文件。 –

回答

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恆定控制。此外,輸出正確對齊。

1

我建議這樣做:

我建議這樣做:

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

這可以使用一些豐富的,我同意一次只做1個是最簡單的方法,但是你可以使用'fprintf()'也使用'isprint(c)'之類的東西? c:'。'是個好主意。 –

1

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

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

雖然有可能在參數傳遞,它不能幫助你與聯合六角顯示如

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

並很快得到相當繁瑣。

不幸的是,有沒有簡單的出路 - 要麼你需要編寫自己的sprintf變種,或使用循環代替。

相關問題