基本凯撒代码;加密字符串。请解释我做了什么 :D

Basic Caesars Code; encrypt string. Please explain what i did :D

任务是加密句子:“我的气垫船里装满了鳗鱼。” 由于其他职责,我错过了练习 class ;) 无论如何,我得出了一个由我在互联网上找到的片段和一些实验组成的结果。它如下:

#include <stdio.h>
int main ()
{

int i=0;
char str[]="My hovercraft is full of eels.";
char c;
while (str[i])     //While String is true (Still characters left)
{
    if (str[i]!='z')   //if character is NOT "z" shift character by one
        {
    (c=str[i]+1);
        }
    else {
            (c=str[i]='a'); //if character equals "z" then the output is "a"
        }


    printf("%c" ,c);  // Shows encrypted string
    i++;
  }
return 0;
}

我的问题是我不知道我到底做了什么。有人可以解释我的代码吗? :D

首先我介绍整数i =0 然后是一串字符 变量 c 也是一个字符。 当字符串中还有字符不等于 z 时加 1 否则c等于a。所以 z = a 但老实说,我不知道为什么它需要我从更复杂的 caesars 代码中复制的 i++。就是这样。

基本上发生的事情是它访问 while 循环中的每个字母,并在使用 str[i] 时被引用。然后,如果字母不是 z,它会将它向上移动一个字母,因此 abc returns bcd。那么,如果字母是z,就变成了a.

您可以稍微修改程序以通过将 str[i]+1 更改为 -1 并切换

来解密输出
while (str[i])     //While String is true (Still characters left)

这是一个非常常见的 C 惯用语,但它实际上是一段棘手的代码。 i 是您在字符串中的索引。当 i 为 0 时,str[i] 是字符串的第一个字符(即 "first character plus zero characters")。当i为1时,为字符串的第二个字符("first character plus one character").

C中的"character"只是一个数字。所以字母 "A" 恰好是 65。你的字符串是:

char str[]="My hovercraft is full of eels.";

所以这实际上是一个数字数组。不明显的是,C 会自动在字符串末尾附加一个零。所以这真的只是为了方便:

char str[] = { 'M', 'y', ' ', 'h', ... 'l', 's', '.', '[=12=]' };

最后一个 [=26=] 称为 NUL(有时也称为 "null")。这是一个字符("letter")。它恰好是值为零的字符。它标志着一个字符串的结尾。这个 "array of byte-sized characters, followed by a NUL" 在 C 中非常常见,并且被广泛称为 cstring ("C string"),即使它出现在其他语言中也是如此。这 不是 表示字符串的唯一方法,但它是迄今为止 C 语言中最常见的方法,也是使用 "..." 语法时得到的结果。

所以每个字符都是一个数字,最后一个字符是零。现在我们使用另一个常见的 C 习语:零为假,所有其他值均为真。所以 while (str[i]) 等同于:

while (str[i] != 0)

或者更准确地说:

while (str[i] != '[=14=]')

这是一种非常啰嗦的说法 "until i refers to the end of the string."

(不要绝望。与第一行相比,其余部分非常简单。但是第一行在 C 语言中非常常见,因此您需要了解正在发生的所有小事情。)

if (str[i]!='z')   //if character is NOT "z" shift character by one

简单易行。如果我们正在查看的当前字符不是 z... "We're looking at" 由 i.

定义
(c=str[i]+1);

不知道这里为什么要加括号。这有点不寻常。但重点是只获取我们正在查看的字符,然后将它的数字表示加一,然后将其分配给 c。由于 ASCII 和 UTF8(两种非常常见的字符串编码方式)都按顺序排列拉丁字母,因此 "a+1" 是 "b".

请注意,这是而非实施正确的凯撒密码。在偏移量为 1 的传统凯撒密码中,"Z" 将转换为 "A"。在这个密码中,"Z" 将转换为“[”。但我很迂腐。值得理解的是,这个密码有一些令人惊讶的极端情况。例如,它会将 z 和反引号 ` 都编码为 a,因此从技术上讲它可能会丢失信息并且无法通过任意 ASCII 输入进行反转(它对于 UTF8 输入完全无效,因此我们甚至不会在这里讨论)。没什么大不了的,但是作为程序员,极端情况就是我们的生活,所以最好知道它适用于哪些输入以及它不适用于哪些输入。

(c=str[i]='a'); //if character equals "z" then the output is "a"

这一行几乎可以肯定是一个错误。括号又很奇怪了,但这不是问题。这行代码的问题在于它修改了 str,而之前的代码没有。几乎可以肯定这段代码应该是:

c = 'a';

当前字符为z时,输出应为a.

printf("%c" ,c);  // Shows encrypted string

这里的评论有点误导。它应该说 "shows encrypted character."

i++;

然后我们将索引向前移动一个字符,然后再开始该过程。 i++ 只是 i = i + 1 的 C 主义。 (它比它出现在表达式内部时稍微复杂一些,但在这种情况下,您可以将其完全替换为 i = i + 1。)

return 0;

并且在 Unix 风格中(C 与之紧密相关),main() returns 零表示 "no error."