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

如何初始化含单双字符的数组及获取双字符char值用于布尔比较

关于音名数组初始化与比较的问题解答

嘿,这个问题我帮你理清楚~首先你原来写的代码有个明显的类型不匹配问题,咱们一步步来解决:

一、原代码的问题

你写的char keyboard[]里混合了单个字符(比如'C')和字符串字面量(比如"C#"),这在C语言里是不合法的:

  • char类型只能存储单个ASCII字符(1字节),而"C#"是长度为2的字符串(加上末尾的\0是3字节),本质是char*类型,和char完全不兼容,编译器会直接报错。

二、正确的实现方案

根据你需要“和其他变量进行布尔比较”的需求,推荐两种实用的方案:

方案1:使用字符串数组(直观易读)

把数组定义为const char*类型,每个元素都是音名的字符串:

const char* keyboard[] = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"};

注意:字符串不能直接用==比较(==只会比较指针地址,不是内容),要使用C标准库的strcmp函数:

// 假设current_note是存储当前音名的字符串
if (strcmp(current_note, "C#") == 0) {
    // 当current_note是"C#"时执行的逻辑
}

方案2:使用枚举类型(最适合布尔比较)

如果想要直接用==做布尔判断,自定义枚举是最佳选择——把每个音名定义为枚举常量,类型安全且直观:

// 先定义枚举类型
typedef enum {
    C, C_SHARP, D, D_SHARP, E, F, F_SHARP, G, G_SHARP, A, A_SHARP, B
} MusicalNote;

// 初始化数组
MusicalNote keyboard[] = {C, C_SHARP, D, D_SHARP, E, F, F_SHARP, G, G_SHARP, A, A_SHARP, B};

这样比较的时候就可以直接用布尔判断,非常简洁:

// 假设current_note是MusicalNote类型的变量
if (current_note == C_SHARP) {
    // 当current_note是C#对应的枚举值时执行的逻辑
}

三、关于“双字符对应的char值”的问题

其实不存在直接对应C#、D#的单个char值:

  • 标准ASCII字符集里没有“C#”这种双字符的单个编码,char只能存单个字符。如果硬要用单个字符代替,你可以考虑用升号的单独字符(比如Unicode的U+266F,显示为♯),但需要用宽字符wchar_t类型存储:
    wchar_t keyboard[] = {L'C', L'♯', L'D', L'♯', ...}; // 但这样会把音名拆成单个字符,不太符合你的需求
    
    这种方式并不实用,因为不同平台的字符编码可能有差异,而且拆分音名也不利于逻辑处理。所以更推荐前面的枚举或字符串数组方案。

内容的提问来源于stack exchange,提问作者Dave Matthew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:25:57