16

这不起作用:

unsigned char foo;
foo = 0x123;

sprintf("the unsigned value is:%c",foo);

我收到此错误:

无法将参数 2 从“无符号字符”转换为“字符”

4

5 回答 5

35

在您查看导致问题的无符号字符之前,请仔细查看以下行:

sprintf("the unsigned value is:%c",foo);

sprintf 的第一个参数始终是将值打印到的字符串。该行应如下所示:

sprintf(str, "the unsigned value is:%c",foo);

除非您的意思是 printf 而不是 sprintf。

修复该问题后,您可以在格式字符串中使用 %u 打印出无符号类型的值。

于 2010-01-12T16:29:18.907 回答
21

使用printf()formta 字符串%u

printf("%u", 'c');
于 2010-01-12T16:23:07.163 回答
6

编辑

snprintf更安全一点。由开发人员确保使用正确的缓冲区大小。

试试这个 :

char p[255]; // example
unsigned char *foo;
...
foo[0] = 0x123;
...
snprintf(p, sizeof(p), " 0x%X ", (unsigned char)foo[0]);
于 2010-01-12T16:21:55.433 回答
3

我认为您对工作方式感到困惑sprintf。第一个参数是字符串缓冲区,第二个参数是格式化字符串,然后是要输出的变量。

于 2010-01-12T16:25:15.490 回答
1

您不应该使用 sprintf,因为它很容易导致缓冲区溢出。

您应该更喜欢 snprintf(或使用 Microsoft 标准 C 库编程时的 _snprintf)。如果您在本地函数的堆栈上分配了缓冲区,您可以执行以下操作:

char buffer[SIZE];
snprintf(buffer, sizeof(buffer), "...fmt string...", parameters);

数据可能会被截断,但这绝对比缓冲区溢出更可取。

于 2010-01-12T17:54:43.483 回答