0

このコードを使用して、結果のバッファーを読み取ります。私の質問は、16進数の文字を表示するC値を、forループの最後でprintfできる新しい文字列にコピーするにはどうすればよいかということです。

for (long i=1; i<sizeof(buffer); i++)  //for all chars in string
{
     unsigned char c = buffer[i];

     switch (Format)
     {
          case 2:         //hex
          printf("%02x",c);
          break;
          case 1:         //asc
          printf("%c",c); // want to copy c to a varriable  byte by byte 
          break;
     }  //end of switch format
} 
4

2 に答える 2

1

私があなたを正しく理解しているなら、これはあなたが必要とするものです:

#include <stdio.h>
#include <string.h>

int main() {
  long i;
  int Format = 2;
  char buffer[20] = "Test string";
  char result[60] = "";
  for (i=0; i<sizeof(buffer); i++)  //for all chars in string
  {
    unsigned char c = buffer[i];
    char* printf_format;
    switch (Format) {
      case 2:         //hex
        printf_format = "%02x";
      break;
      case 1:         //asc
        printf_format = "%c";
      break;
    }  //end of switch format
    sprintf(result + strlen(result), printf_format, c);
  } 
  printf("result: %s\n", result); 

}

result + strlen(result)これは、文字列の末尾へのポインターです。というわけsprintfで最後まで書きます。出力文字列の長さを把握し、それを保持するのに十分なメモリを割り当てる必要があることに注意してください。また、ループの最初の値はi1 ではなく 0 にする必要があることに注意してください。

于 2012-07-20T23:09:05.573 に答える
0
char *printit(char *buffer, long buflen)
{
   char out[512];
   int offset=0;

   for (long i=1; i<buflen; i++)
   {
     int l = snprintf(out+offset, sizeof(out)-offset, Format==1?"%c":"%02x", buffer[i]);
     if (l > sizeof(out)-offset)
     {
       fprintf(stderr, "Output buffer insufficiently large\n");
       return(NULL);
     }
     offset += l-1;
   }
   return(strdup(out));
 }

質問コードで、バッファの最初の文字をスキップしていることに注意してください。isprint() は、不思議な Format 変数よりも優れた関数かもしれません。

于 2012-07-20T23:08:56.307 に答える