首页 > 解决方案 > 字符类型隐式减法在 C 中不起作用

问题描述

#include <stdio.h>

char decryptFun(int shift, char pt_letter);
int mod(int x, int y);

int main() {
    char f = 'f';
    char r = 'r';
    char y = 'y';

    int encryptKey = 3;
    int test = 'f' - 'a';
    printf("%d", test);
    printf("%c", decryptFun(encryptKey, f));
    printf("%c", decryptFun(encryptKey, r));
    printf("%c", decryptFun(encryptKey, y));
   
    return 0;
}

int mod(int x, int y) {
    while (x < 0) {
        x += y;
    }
    return x % y;
}

char decryptFun(int shift, char pt_letter) {
    int letterPosition = (int) pt_letter - 'a';
    int rawDecryptedLetter = mod((letterPosition + 3), 26);
    char decryptedLetter = (char)rawDecryptedLetter;
    return decryptedLetter;
}

我正在做一项学校作业,其中要求我将字母表中的字母从 0(“a”)到 25(“z”)编入索引。我正在尝试通过执行减法将字母转换为这种格式。前任。int test = 'f' - 'a'。但是,在调试中,我看到该变量“test”的存储值是一个荒谬的数字。应该是它们的ascii索引之差(102 - 97 = 5),变量显示它的值为-858993460。在调试中,我可以看到“f”和“a”都有正确的 ascii 值 102 和 97。为什么这个减法不起作用?

标签: ccharacter

解决方案


正如@Craig Estey 推荐的那样使用unsigned char

decryptFun可以简化为return 'a' + (pt_letter - 'a' + shift) % 26; }

#include <stdio.h>

unsigned char decryptFun(unsigned int shift, unsigned char pt_letter);

int main() {
    char f = 'f';
    char r = 'r';
    char y = 'y';

    unsigned int encryptKey = 3;
    int test = 'f' - 'a';
    printf("%d\n", test);
    printf("%c\n", decryptFun(encryptKey, f));
    printf("%c\n", decryptFun(encryptKey, r));
    printf("%c\n", decryptFun(encryptKey, y));

    return 0;
}


unsigned char decryptFun(unsigned int shift, unsigned char pt_letter) {
    return 'a' + (pt_letter - 'a' + shift) % 26;
}

推荐阅读