从循环复制到变量c

时间:2012-07-20 22:51:59

标签: c loops

我正在使用此代码来读取结果缓冲区。我的问题是如何将显示十六进制字符的C值复制到一个新字符串中,我可以在for循环结束时打印出来。

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
} 

2 个答案:

答案 0 :(得分: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将写到最后。请注意,您必须确定输出字符串的长度,并分配足够的内存来保存它。另请注意,循环中i的第一个值应为0而不是1。

答案 1 :(得分: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变量更好的函数。