基本凯撒代码;加密字符串。请解释我做了什么 :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."
任务是加密句子:“我的气垫船里装满了鳗鱼。” 由于其他职责,我错过了练习 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."