这个不起作用:
unsigned char foo;
foo = 0x123;
sprintf("the unsigned value is:%c",foo);
我遇到了这个错误:
无法将第二个参数从'unsigned char'转换为'char'
这个不起作用:
unsigned char foo;
foo = 0x123;
sprintf("the unsigned value is:%c",foo);
我遇到了这个错误:
无法将第二个参数从'unsigned char'转换为'char'
在你开始查找无符号字符引起的问题之前,仔细看一下这一行:
sprintf("the unsigned value is:%c",foo);
sprintf的第一个参数始终是要打印值的字符串。该行代码应该类似于:
sprintf(str, "the unsigned value is:%c",foo);
除非你想使用printf而不是sprintf。
修复后,您可以在格式字符串中使用%u来打印无符号类型的值。
UCHAR_BIT
> 8 的系统,例如16位DSP。 - MSalters使用printf()
格式化字符串的%u
:
printf("%u", 'c');
编辑
snprintf
更加安全一些。开发人员需要确保使用正确的缓冲区大小。
尝试这个:
char p[255]; // example
unsigned char *foo;
...
foo[0] = 0x123;
...
snprintf(p, sizeof(p), " 0x%X ", (unsigned char)foo[0]);
我认为你对sprintf
的工作方式有所困惑。第一个参数是字符串缓冲区,第二个是格式化字符串,然后是你想要输出的变量。
在编程中,不应使用sprintf函数,因为它很容易导致缓冲区溢出。
建议使用snprintf函数(或在使用Microsoft标准C库进行编程时使用_snprintf函数)。如果您已经在本地函数中分配了堆栈上的缓冲区,则可以执行以下操作:
char buffer[SIZE];
snprintf(buffer, sizeof(buffer), "...fmt string...", parameters);
数据可能会被截断,但这绝对比溢出缓冲区要好。
isalnum(..)
而不是实际的十六进制值,而不是任意打印字符值。并非所有字符都具有可见的十六进制值,例如 0x01。 - user195488