You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:09:02