如何初始化含单双字符的数组及获取双字符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
相关产品推荐
相关产品推荐

