c - C中字符总和的问题

标签 c encryption char

我对 C 很陌生,所以我会快速完成:我正在制作凯撒密码,但在某些时候它开始给我?符号。

#include <stdio.h>
#include <ctype.h>

int main(void){
    char c;
    int k;

    printf("Inserisci la chiave di cifratura: ");
    scanf("%d", &k);
    if (k > 26)
        k = (k%26);
    printf("%d", k);

    while ((c=getchar()) != '.') {
        if (isalpha(c)) {
            if (c >= 'a' && c <= 'z') {
                c = c + k;
                if (c > 'z') {
                    c = c - 'z' + 'a' - 1;
                }
            }
            else if (c >= 'A' && c <= 'Z') {
                c = c + k;
                if (c > 'Z') {
                    c = c - 'Z' + 'A' - 1;
                }
            }
            putchar(c);
        }
        else
            putchar(c);
    }

    printf("\n");
    return 0;
}

如果 k 是 6,它就会开始给我带有 z 的符号。 如果是7,则以y开头。 等等...

我找不到任何东西,谢谢帮助我的人。

最佳答案

当您使用char时,无论将其视为signed char还是unsigned char,它都是实现定义的。您的实现显然默认为 signed char'z' 的值为 122,当您添加 6 时,您会得到 128,该值会溢出并导致未定义的行为。 signed char 的最大值为 127

您应该将c声明为intunsigned char

关于c - C中字符总和的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58939902/

相关文章:

java - 为什么在 Java 中允许将 double 转换为 char?

c - 核心文件的 gdb 回溯打印错误 "no such file or directory"

c - 多次调用fread使程序行为异常

c - 在 Linux 下从一个 C 程序运行多个 C 程序

ssl - 为 Traefik 推荐的 TLS 密码

PHP 和 Javascript 兼容的加密函数

c# - SocketAsyncEventArgs 加密——SSL 与自定义预传输加密

c - 代码是如何工作的?

c++ - 在c中调整字符数组的大小

java - Swift 解码和编码字符串