使用无符号字符的Caesar密码函数?

使用无符号字符的Caesar密码函数?,c,C,我正在处理一个Caesar函数,它给定输入和偏移量,返回输出。我不确定我是否在做这件事。我做错了什么?感谢您的帮助。 还有,如果有人能告诉我如何使用未签名字符 void encrypt(unsigned char* message_input, char off, unsigned char* message_output) { int m_inp; while(*(message_input+ m_inp)!=EOF) { *(message_out

我正在处理一个Caesar函数,它给定输入和偏移量,返回输出。我不确定我是否在做这件事。我做错了什么?感谢您的帮助。 还有,如果有人能告诉我如何使用未签名字符

void encrypt(unsigned char* message_input, char off, unsigned char* message_output) {

    int m_inp;

    while(*(message_input+ m_inp)!=EOF)
    {
        *(message_output+ m_inp) = (*((unsigned char*)input + m_inp) + offset )%256;
    }

}

你写的代码有很多错误

1) 您尚未初始化m_inp,但正在延迟(消息输出+m_inp)

2) 您正在检查输入字符串的EOF,这毫无意义

请看一下这段代码,这是一个更好的凯撒密码实现

#include <stdio.h>

void caesar (char cipher[], int shift);

int main () {

char cipher[50];
int shift;

printf("Enter text to be encrypted IN CAPITAL LETTERS ONLY: ");
scanf("%s", cipher);

printf("How many shifts do you prefer? 1-10 only: ");
scanf("%d", &shift);

caesar (cipher, shift);

return 0;
}

void caesar (char cipher[], int shift) {
  int i = 0;

  while (cipher[i] != '\0') {
    if ((cipher[i] += shift) >= 65 && (cipher[i] + shift) <= 90) {
      cipher[i] += (shift);
     } else {
      cipher[i] += (shift - 25); 
       }
    i++;
   }
  printf("%s", cipher);
}
#包括
void-caesar(字符密码[],int-shift);
int main(){
字符密码[50];
int移位;
printf(“仅输入要用大写字母加密的文本:”);
scanf(“%s”,密码);
printf(“您喜欢多少班次?仅1-10班:”;
scanf(“%d”和shift);
凯撒(密码,移位);
返回0;
}
void caesar(字符密码[],int移位){
int i=0;
while(密码[i]!='\0'){

如果((cipher[i]+=shift)>=65&&(cipher[i]+shift),则代码存在许多正确性和风格问题

正确性问题
  • 循环变量
    m_inp
    未初始化

  • unsigned char
    不太可能等于
    EOF
    EOF
    的值为-1。循环永远不会结束(除非您使用非常奇怪的体系结构)

  • 传统的凯撒密码按字母顺序操作,而不是对整个ASCII字符集进行操作

  • 文体问题 使用更“风格正确”的C将使其他程序员更容易阅读您的代码。这些都是主观的

  • 名称
    m_inp
    对于短循环中的循环变量来说是个糟糕的名称。请改用
    i

  • 阅读
    ptr[i]
    比阅读
    *(ptr+i)
    更容易,即使它们在C中完全相同

  • 将输入标记为
    const unsigned char*
    可以更明显地看出它没有被修改

  • 使用
    int
    而不是
    char
    作为偏移量

  • 传统上,功能输出在左边,输入在右边。然而,这并不重要

  • 修订守则 这是一个示例修订版。它接受以NUL结尾的字符串,并将Caesar编码/解码版本写入输出缓冲区。这是我编写函数的方式,不一定是您编写函数的方式:

    void caesar(char *output, const char *input, int shift)
    {
        int i;
        for (i = 0; input[i]; i++) {
            if (input[i] >= 'a' && input[i] <= 'z')
                output[i] = (input[i] - 'a' + shift) % 26 + 'a';
            else if (input[i] >= 'A' && input[i] <= 'Z')
                output[i] = (input[i] - 'A' + shift) % 26 + 'A';
            else
                output[i] = input[i];
        }
        output[i] = '\0';
    }
    
    void caesar(字符*输出,常量字符*输入,整数移位)
    {
    int i;
    对于(i=0;输入[i];i++){
    
    如果(input[i]>='a'&&input[i]='a'&&input[i]
    EOF
    类型为
    int
    且具有负值。类型为
    unsigned char
    的所有对象的值均为正值。您的比较将始终为真(永远、永远、永远……)。如果不初始化m_-inp,则无法取消引用(message_-output+m_-inp)就是说,我正在尝试使用无符号字符,而不是有符号字符或只有字符来实现这一点。我看不到字符串文字。@DietrichEpp我是说不可变的字符*message\u输入和字符*message\u输出字符串@我做了上面的更改。这看起来像是rite吗?是什么使它们不可变?@DietrichEpp,我想我知道创建的字符串是cOnStand,修改它们是不明确的,但不能回忆在哪里,请帮助我如果你能。但是我发现它是在C++中贬值的。