俺太笨了,只会枚举:

#include<stdio.h>
int main(){
    char c;
    while(~scanf("%c",&c)){
        if(c=='Z')
            printf("a");
        else if('A'<=c&&c<'Z')
            printf("%c",c+33);
        else if('a'<=c&&c<='z')
        {
            if('a'<=c&&c<='c') printf("2");
            if('d'<=c&&c<='f') printf("3");
            if('g'<=c&&c<='i') printf("4");
            if('j'<=c&&c<='l') printf("5");
            if('m'<=c&&c<='o') printf("6");
            if('p'<=c&&c<='s') printf("7");
            if('t'<=c&&c<='v') printf("8");
            if('w'<=c&&c<='z') printf("9");
        }
        else printf("%c",c);
    } printf("\n");
}

讨论区学到另一种思路:定义两个字符串,一个是输入的数据集,一个是输出的数据集,每个位置一一对应。对每次输入的数据,在输入数据集中进行查找,若查找成功 则返回输出数据集中对应位置上的数据;若查找失败,则直接输出这个数据(即数字和其他的符号都不做变换):

const string dict1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
const string dict2="bcdefghijklmnopqrstuvwxyza22233344455566677778889999";
 
char Char_Change(char a){
    for(int i=0;i<dict1.size();i++)
        if(dict1[i]==a) return dict2[i];
    return a;
}