键盘移位的方法&x27;使用C将s键向右移动2位

键盘移位的方法&x27;使用C将s键向右移动2位,c,ascii,C,Ascii,我试图将键盘的键向右移动2位,例如,如果用户想键入“a”,他们必须按键盘上的“d”键,“p”到“]” 这意味着如果用户输入是:“pm[ojku d,d]]'t/” 然后输出将是:“我买了一个苹果” 不包括大写键和键盘上最后一行的键 我这样做的方式是检查字符串的每个字符,并将其ASCII码与每个大小写进行比较,它工作得非常好。但这样做让我觉得很傻,我想知道有没有什么算法或更聪明的方法来实现这一点 while (fgets(inputString, 500, stdin)) { string

我试图将键盘的键向右移动2位,例如,如果用户想键入“a”,他们必须按键盘上的“d”键,“p”到“]”

这意味着如果用户输入是:“pm[ojku d,d]]'t/”

然后输出将是:“我买了一个苹果”

不包括大写键和键盘上最后一行的键

我这样做的方式是检查字符串的每个字符,并将其ASCII码与每个大小写进行比较,它工作得非常好。但这样做让我觉得很傻,我想知道有没有什么算法或更聪明的方法来实现这一点

while (fgets(inputString, 500, stdin)) {
    stringLength = strlen(inputString);

    for (int i = 0; i < stringLength; i++) {
        switch (inputString[i]) {
            case 100:
                outputString[i] = 'a';
                break;
            case 109:
                outputString[i] = 'b';
                break;
            case 98:
                outputString[i] = 'c';
            case 47:
                outputString[i] = ',';
                break;
            case 50:
                outputString[i] = '`';
                break;
            case 92:
                outputString[i] = '[';
                break;
            default:
                outputString[i] = inputString[i];
        }
    }
    printf("%s", outputString);
}
while(fgets(inputString,500,stdin)){
stringLength=strlen(输入字符串);
对于(int i=0;i
这是一个使用查找表的通用替换函数。它应该能够完成这项工作。我已经填写了
'd'
's'
的转换。您可以填写其余的。表中的NUL字符表示没有替换

const char table[256] = {
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 48
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 64
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80
             0, 0, 0, 0, 'a', 0, 's', 0, 0, 0, 0, 0, 0, 0, 0, 0, // 96
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 112
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 144
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 176
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 192
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 224
             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  // 240
};

void replace(char *str, const char table[256])
{
    while(*str) {
        if(table[*str])
            *str = table[(unsigned char)*str];
        str++;
    }
}

int main(void)
{
    char str[] = "dfdffd";
    replace(str, table);
    printf("%s\n", str);
}
如果你更喜欢写一个新的字符串,你可以使用它。即使输入和输出是相同的,它也可以工作

void replace(char *dest, const char *src, const char table[256])
{
    while(*src) {
        if(table[*src])
            *dest = table[(unsigned char)*src];
        src++;
        dest++;
    }
}

关于工作代码的问题可能应该发布在代码审阅上,而不是这样。可能是使用表,而不是开关/大小写。索引您的字符。使用查找表,它只有128或256个条目。例如,
lookup['d']
包含
a
。还要记住,键盘并非都有相同的布局。例如,在法语国家,最上面一行的字母实际上是一个字母,而不是一个字母。像
“@#£
这样的符号的位置也不同。