You need to enable JavaScript to run this app. C++实现QWERTY键盘指定按键邻近按键查询的方案咨询
优惠活动
大模型
产品
解决方案
定价
更多

C++实现QWERTY键盘指定按键邻近按键查询的方案咨询

实现方案

完全不需要逐字符编写switch分支,核心通过键盘坐标映射+物理错位偏移规则实现,计算结果可完全匹配示例输出。

核心逻辑

  1. 将QWERTY键盘的每一行按键按物理排列顺序存入二维数组,为每个按键分配(行号, 列号)的坐标
  2. 基于物理键盘每一行错开半格的实际结构,定义固定的相邻位置偏移量(经校验,该偏移规则计算j键邻居时,可完全得到U、I、H、K、N、M的预期结果)
  3. 查询时先定位目标按键的坐标,按偏移规则收集所有不越界的有效按键,即为物理相邻的按键集合

具体代码实现

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 11:27:02