Closed. This question needs to be more
focused。它当前不接受答案。
想改善这个问题吗?更新问题,使其仅通过
editing this post专注于一个问题。
3年前关闭。
任务是加密以下句子:“我的气垫船充满了鳗鱼。”
由于其他职责,我错过了运动课;)
无论如何,我得出的结果都是在网上找到的摘要的片段,并做了一些实验。它如下:
#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
首先,我介绍整数= 0
然后是一串字符
变量c也是一个字符。
字符串中剩余字符时,如果不等于z,则加1
否则c等于a。所以z = a
但老实说,我不知道为什么它需要从复杂得多的凯撒代码复制的i ++。就是这样了。
while (str[i]) //While String is true (Still characters left)
这是一个非常常见的C习惯用法,但实际上是一段棘手的代码。
i
是您在字符串中的索引。当
i
为0时,
str[i]
是字符串的第一个字符(即“第一个字符加零个字符”)。当
i
为1时,它是字符串的第二个字符(“第一个字符加一个字符”)。
C中的“字符”只是一个数字。因此,字母“ A”正好是65。您的字符串是:
char str[]="My hovercraft is full of eels.";
因此,这实际上是一个数字数组。不明显的是C会自动在字符串末尾附加一个零。因此,这实际上只是为以下目的提供了便利:
char str[] = { 'M', 'y', ' ', 'h', ... 'l', 's', '.', '\0' };
最后一个
\0
称为
NUL
(或有时为“ null”)。这是一个字符(“字母”)。它恰好是值为零的字符。它标志着字符串的结尾。这种“字节大小的字符数组,后跟
NUL
”在C语言中非常常见,即使它以其他语言显示,也被广泛称为cstring(“ C字符串”)。这不是表示字符串的唯一方法,而是迄今为止在C语言中最常见的方法,这就是使用
"..."
语法时所得到的。
所以每个字符是一个数字,最后一个字符是零。现在,我们使用另一个常见的C惯用法:零为假,其他所有值为真。因此
while (str[i])
等效于:
while (str[i] != 0)
或更确切地说:
while (str[i] != '\0')
这是一种疯狂而漫长的说法,“直到
i
指向字符串的末尾”。
(不要绝望。与第一行相比,其余的操作非常简单。但是第一行在C语言中非常常见,因此您需要了解所有正在发生的小事情。)
if (str[i]!='z') //if character is NOT "z" shift character by one
十分简单。如果我们正在查看的当前字符不是
z
...“我们正在查看”由
i
定义。
(c=str[i]+1);
不知道为什么这里有括号。那是不寻常的。但关键是只采用我们正在查看的字符,并在其数字表示形式中添加一个,然后将其分配给
c
。由于ASCII和UTF8(两种非常常见的字符串编码方式)都按拉丁字母顺序排列,因此“ a + 1”为“ b”。
请注意,这没有实现适当的Caesar密码。在具有偏移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
这里的评论有点误导。它应该说“显示加密的字符”。
i++;
然后,我们将索引向前移动一个字符,然后再次开始该过程。
i++
只是
i = i + 1
的C-ism。 (它比出现在表达式中时要稍微复杂一些,但是在这种情况下,您可以用
i = i + 1
完全替换它。)
return 0;
并且在Unix风格(C与之交织在一起)中,
main()
返回零表示“没有错误”。