如何将unsigned short数组中存储的字符串转为char数组用于printf调试输出
问题解答
遍历unsigned short数组依次将值存入char数组的方案完全可行,也是兼容性最高的实现方式。
直接调用printf("%s", a)只能输出第一个字符的原因:%s格式化符要求传入char*类型的指针,底层会按字节逐次读取内容,直到遇到\0空终止符停止。unsigned short占2字节,在小端模式的设备上存储字符h(ASCII码0x68)时,内存排布为0x68 0x00,因此printf读取第一个字节输出h后,第二个字节直接被识别为字符串结束符,导致后续内容不会输出。
实现方案
方案1:手动遍历转换(无平台依赖,推荐用于调试场景)
只要你存入unsigned short的是ASCII范围内的单字节字符,直接遍历强转即可,注意目标char数组长度要比原short数组多1位,用于存储字符串结束符:
#include <stdio.h> int main() { unsigned short a[5] = {'h', 'e', 'l', 'l', 'o'}; // char数组长度 = short数组元素数 + 1(存结束符) char b[6]; int short_arr_len = sizeof(a) / sizeof(a[0]); for (int i = 0; i < short_arr_len; i++) { b[i] = (char)a[i]; } // 手动补字符串结束符 b[short_arr_len] = '\0'; printf("%s\n", b); return 0; }
方案2:宽字符库转换(适合存储UTF-16宽字符的场景)
如果unsigned short数组里存的是UTF-16编码的宽字符,可以用标准库wcstombs函数转换,前提是当前平台的wchar_t长度为2字节(多数Windows平台符合该条件):
#include <stdio.h> #include <wchar.h> #include <stdlib.h> int main() { // 宽字符串需要自带\0结束符 unsigned short a[6] = {'h', 'e', 'l', 'l', 'o', L'\0'}; char b[6]; wcstombs(b, (wchar_t*)a, sizeof(b)); printf("%s\n", b); return 0; }
内容的提问来源于stack exchange,提问作者Onyxdragun
相关产品推荐
相关产品推荐

