我知道还有其他这样的帖子,但我认为我的不同。我有一组我希望展示的数字。但是,它保存为unsigned short。正如它是从网络缓冲区给我的,我的所有数据都是无符号的短格式。因此,对于以“ABC-”开头的序列号,两个无符号短路将保持0x4142和0x432D(已经是ASCII格式)。我需要将那些转换为char类型以使用printf和%s进行显示,但对于我的系统的其余部分,它们需要保持为unsigned short。这是我到目前为止所尝试的,但输出是空白的:
unsigned char * num[3];
num[0] = (unsigned char*)(SYSTEM_N >> 8);
num[1] = (unsigned char*)(SYSTEM_N & 0x00FF);
printf("System Number: %s \r\n", num);
任何人都可以为我阐明这一点吗?谢谢!
答案 0 :(得分:4)
有几个错误:1)数组太短,2)将数组定义为指针数组,3)不终止字符串。
#include <stdio.h>
int main (void)
{
unsigned short system_m = 0x4142;
unsigned short system_n = 0x432D;
unsigned char num[5];
num[0] = system_m >> 8;
num[1] = system_m & 0xFF;
num[2] = system_n >> 8;
num[3] = system_n & 0xFF;
num[4] = '\0';
printf("System Number: %s \r\n", num);
return 0;
}
编辑或者,如果您不想保留字符串,只需显示以下信息:
#include <stdio.h>
int main (void)
{
unsigned short system_m = 0x4142;
unsigned short system_n = 0x432D;
printf("System Number: %c%c%c%c \r\n",
system_m >> 8, system_m & 0xFF, system_n >> 8, system_n & 0xFF);
return 0;
}
节目输出:
System Number: ABC-
答案 1 :(得分:2)
你可能打算写
unsigned char num[3];
如你所知,你声明一个包含三个char*
指针的数组。
另外不要忘记在打印之前设置关闭NUL字符:
num[2] = '\0';
答案 2 :(得分:0)
一般解决方案可能是这样的,假设ushort_arr
包含数组中的unsigned short
,ushort_arr_size
表示其大小。
char *str = malloc(ushort_arr_size * 2 + 1);
// check if str == NULL
int j = 0;
for (int i = 0; i < ushort_arr_size; i++) {
str[j++] = ushort_arr[i] >> 8;
str[j++] = ushort_arr[i];
}
str[j] = '\0';
printf("string is: %s\n", str);
free(str);
虽然如果没有内存管理,这可能会更有效,但如果您只想打印一次:
for (int i = 0, j = 0; i < ushort_arr_size; i++) {
putchar(ushort_arr[i] >> 8);
putchar(ushort_arr[i] & 0xFF);
}