【问题标题】:C printf unsigned char arrayC printf无符号字符数组
【发布时间】:2014-01-21 15:04:49
【问题描述】:

我有一个无符号字符数组unsigned char* name = malloc(nameLength); - 如何使用 printf 打印它? %s 似乎不能正常工作,%u 也不能正常工作(看到随机图标)。

以下是我创建要打印的数据的方法:

__int32 nameLength;
ReadProcessMemory(hProcess, (LPCVOID)(classNamePtr + 0x0004), &nameLength, sizeof(__int32), 0); //Reads nameLength to be 13 in this case
unsigned char* name = malloc(nameLength+5); //Add 5 for good measure, it is null terminated
ReadProcessMemory(hProcess, (LPCVOID)(nameStrPtr), name, nameLength, 0);
name[nameLength] = 0; //null terminate

printf("%s", name); //Outputs single character strange characters, like an up icon

【问题讨论】:

  • 如果name 包含一个以空字符结尾的可打印字符字符串,那么printf 格式%s 将起作用。这就是它的用途。数组中有什么,只是任意数字?可以多分享一点吗?
  • 你没有给我们足够的信息。阅读sscce.org
  • 我添加了更多信息@KeithThompson
  • 如果它以空值终止,%s 应该可以工作。由于最后有空闲空间,请尝试在此处手动写入 \0,然后再试一次。
  • @gnometorule 在我这样做的代码中 - name[nameLength] = 0

标签: c char printf unsigned-char


【解决方案1】:

当检测到不可打印字符时,输出转义序列或十六进制值

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

int printf_ByteArray(const unsigned char *data, size_t len) {
  size_t i;
  int result = 0;
  for (i = 0; i < len; i++) {
    int y;
    int ch = data[i];
    static const char escapec[] = "\a\b\t\n\v\f\n\'\"\?\\";
    char *p = strchr(escapec, ch);
    if (p && ch) {
      static const char escapev[] = "abtnvfn\'\"\?\\";
      y = printf("\\%c", escapev[p - escapec]);
    } else if (isprint(ch)) {
      y = printf("%c", ch);
    } else {
      // If at end of array, assume _next_ potential character is a '0'.
      int nch = i >= (len - 1) ? '0' : data[i + 1];
      if (ch < 8 && (nch < '0' || nch > '7')) {
        y = printf("\\%o", ch);
      } else if (!isxdigit(nch)) {
        y = printf("\\x%X", ch);
      } else {
        y = printf("\\o%03o", ch);
      }
    }
    if (y == EOF)
      return EOF;
    result += y;
  }
  return result;
}

如果data 包含每个字节之一,示例如下:

\0...\6\a\b\t\n\v\f\xD\xE\xF\x10...\x1F !\"#$%&amp;\'()*+,-./0123456789:;&lt;=&gt;\?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F...\xFE\o377

转义序列的选择会因代码目标而异。上面的集合尝试符合 C 解析器可以接受的内容。
注意:对于最后一个else,始终输出 3 位八进制序列具有扫描优势,但人们更习惯于使用十六进制而不是八进制。
调整为根据以下字符有条件地以十六进制打印。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多