C++实现QWERTY键盘指定按键邻近按键查询的方案咨询
实现方案
完全不需要逐字符编写switch分支,核心通过键盘坐标映射+物理错位偏移规则实现,计算结果可完全匹配示例输出。
核心逻辑
- 将QWERTY键盘的每一行按键按物理排列顺序存入二维数组,为每个按键分配
(行号, 列号)的坐标 - 基于物理键盘每一行错开半格的实际结构,定义固定的相邻位置偏移量(经校验,该偏移规则计算
j键邻居时,可完全得到U、I、H、K、N、M的预期结果) - 查询时先定位目标按键的坐标,按偏移规则收集所有不越界的有效按键,即为物理相邻的按键集合
具体代码实现
#include <vector> #include <string> #include <cctype> // 预存US QWERTY物理布局,按从上到下的行顺序排列,统一存为小写方便匹配 const std::vector<std::string> US_LAYOUT = { "`1234567890-=", "qwertyuiop[]\\", "asdfghjkl;'", "zxcvbnm,./" }; // 物理相邻坐标偏移规则(相对当前键(r,c)) const std::vector<std::pair<int, int>> NEIGHBOR_OFFSETS = { {-1, 0}, {-1, 1}, // 上一行的两个斜向邻居(上一行整体右移半格) {0, -1}, {0, 1}, // 同一行的正左、正右邻居 {1, -1}, {1, 0} // 下一行的两个斜向邻居(下一行整体左移半格) }; std::vector<char> charsNearChar(char target) { std::vector<char> neighbors; target = std::tolower(target); // 定位目标按键在布局中的坐标 int target_r = -1, target_c = -1; for (int r = 0; r < static_cast<int>(US_LAYOUT.size()); r++) { size_t c = US_LAYOUT[r].find(target); if (c != std::string::npos) { target_r = r; target_c = static_cast<int>(c); break; } } if (target_r == -1) return neighbors; // 按偏移收集所有有效邻居 for (auto offset : NEIGHBOR_OFFSETS) { int r = target_r + offset.first; int c = target_c + offset.second; // 边界检查,过滤超出键盘范围的无效位置 if (r >=0 && r < static_cast<int>(US_LAYOUT.size()) && c >=0 && c < static_cast<int>(US_LAYOUT[r].size())) { neighbors.push_back(US_LAYOUT[r][c]); } } return neighbors; }
校验测试:输入
'j'时,函数返回的集合为u、i、h、k、n、m,和示例输出完全一致。
布局适配
- 上述实现默认使用US布局,如需切换为UK布局,只需替换
US_LAYOUT数组为对应UK布局的行字符串即可,核心逻辑无需修改 - UK布局与US布局的核心字母行排列完全一致,仅部分符号键(如
#、@、反斜杠)的位置有差异
内容的提问来源于stack exchange,提问作者user15200288
相关产品推荐
相关产品推荐

