如何使用sprintf格式化无符号字符?

16

这个不起作用:

unsigned char foo;
foo = 0x123;

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

我遇到了这个错误:

无法将第二个参数从'unsigned char'转换为'char'


你确定错误不是“无法将参数2从'unsigned char'转换为'char *'”吗? - Richard Pennington
5
您遗漏了 sprintf() 函数的一个参数。第一个参数是输出缓冲区,第二个参数是格式化字符串,其余参数依赖于格式化字符串的具体内容。如果您只想将内容打印到标准输出,可以使用 printf() 函数(注意开头没有 's')。 - Martin York
我建议您检查是否为 isalnum(..) 而不是实际的十六进制值,而不是任意打印字符值。并非所有字符都具有可见的十六进制值,例如 0x01。 - user195488
5个回答

35

在你开始查找无符号字符引起的问题之前,仔细看一下这一行:

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

sprintf的第一个参数始终是要打印值的字符串。该行代码应该类似于:

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

除非你想使用printf而不是sprintf。

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


5
同时,0x123太大了,无法放入无符号字符变量中。你可能想要使用foo = 123(ASCII码为'{')代替。 - Dolphin
@Dolphin:很可能。但它适用于那些 UCHAR_BIT > 8 的系统,例如16位DSP。 - MSalters

21

使用printf()格式化字符串的%u

printf("%u", 'c');

3
请注意,我正在调用 printf 而不是 sprintf,只是为了举例说明你需要使用 "%u" 来获取字符的十进制值。 - Ariel

6

编辑

snprintf 更加安全一些。开发人员需要确保使用正确的缓冲区大小。

尝试这个:

char p[255]; // example
unsigned char *foo;
...
foo[0] = 0x123;
...
snprintf(p, sizeof(p), " 0x%X ", (unsigned char)foo[0]);

1
这只是一个例子..你需要将其格式化为某个无符号字符。p是一个字符串缓冲区。 - user195488
然后我得到了这个错误:下标需要数组或指针类型 - Christoferw

3

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


1

在编程中,不应使用sprintf函数,因为它很容易导致缓冲区溢出。

建议使用snprintf函数(或在使用Microsoft标准C库进行编程时使用_snprintf函数)。如果您已经在本地函数中分配了堆栈上的缓冲区,则可以执行以下操作:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接