如何将const unsigned char数组中的元素转换为char

问题描述

我正在尝试遍历单个const unsigned char数组,并使用类型转换将每个元素分配/转换为新的char数组,我阅读的每个线程都建议使用类型转换,但是它对我不起作用,这是我的尝试:

#include <stdio.h>
#include <stdlib.h>

char *create_phone_number(const unsigned char nums[10]) {
  char *new = malloc(11);
  int i = 0;
  for (; i<10; i++) 
    new[i] = (char)nums[i];
  new[i] = '\0';
  return new;
}

int main(void) {
    char *num = create_phone_number((const unsigned char[]){ 1,1,1 });
    printf("%s\n",num);
    free(num);
    return 0;

}

以上代码的标准输出

预期的标准输出

1111111111

如何将nums中的元素转换为类型char并将转换后的值有效地分配/存储在new数组中?

解决方法

强制转换为char并不意味着将整数值转换为相应的ASCII字符;数值1是ASCII代码SOH(标题开头),它没有可打印的表示形式,因此为空输出。如果您知道所有值都在0到9的范围内,则可以将它们添加到ASCII '0'中,以获得产生相关ASCII数字的char值:

char *create_phone_number(const unsigned char nums[10]) {
  char *new = malloc(11);
  for (int i=0; i<10; i++) 
    new[i] = '0' + nums[i];
  new[i] = '\0';
  return new;
}

您实际上根本不需要投射它; +的结果将是int,并将其存储回一个char即可完全适合它的状态(因此,请确保它们确实全部为0- 9的值,否则您会得到奇怪的结果。