我应该如何用指针算法解决这个密码?

时间:2013-11-07 14:56:01

标签: c pointers encryption pointer-arithmetic

问题是:

  

使用指针算法解决以下密码。给定的字符串是GKQTEHIN。定义一个指针并将其设置为此字符串中的字母“T”。向前和向后遍历字符串。为每个字母添加/减去1到5之间的单个值(键)以解决此密码并形成有意义的单词。提示:当你解决它时,你将使用它。

希望这已经正确完成......

char given[]="GKQTEHIN";
char *pointer; 
pointer=&given[3];

pointer-=3;
printf("%c", *pointer-4);

pointer+=1;
printf("%c", *pointer+4);

pointer+=1;
printf("%c", *pointer-4);

pointer+=1;
printf("%c", *pointer-4);

pointer+=1;
printf("%c", *pointer+4);

pointer+=1;
printf("%c", *pointer+4);

pointer+=1;
printf("%c", *pointer-4);

pointer+=1;
printf("%c\n\n", *pointer+4);

打印“COMPILER”一词。

4 个答案:

答案 0 :(得分:0)

  

如何“为每个字母添加/减去单个值”?

计算机只能识别和使用数字,因为计算机中的所有内容都是数字(或可以被视为数字)。这意味着字母实际上是内部数字。 C中的char使用ASCII encoding,这使得每个字母对应一个数字。所以你只需将密钥添加到代表char的代码中。您可以使用char作为数字,没有任何问题。

char a = 'a';
a++;
printf("%c\n", a); // prints 'b'

答案 1 :(得分:0)

要为char添加一些值,请使用以下命令。您可以通过循环遍历整个字符串来执行此操作。

int main()
{
    char ch = 'a';  // or some other character
    int x = 2;  // or some other value
    ch = (ch - 'a' + x) % 26 + 'a';  // make sure you have a value between 'a' and 'z'

    printf("%c\n", ch); // prints 'c'
}

答案 2 :(得分:0)

您需要在此处应用两个概念:

首先,pointer是一个变量,其中包含given[]中某个字符的地址

如果你加1,它将指向下一个字符。如果从中减去1,它将指向前一个字符。

但是你需要将它保持在数组的边界内。所以pointer永远不会小于&given[0](或只是given,它也会计算第一个元素的地址),并且当它指向空字符时你应该停止递增( \0)在字符串的末尾。您可以通过创建在每次迭代时递增pointer的循环来执行此操作,通过在pointer指向空字符时将given重置为T来处理边界,并在它到达{时停止{1}}再次。

其次,*pointerpointer指向的字符。

您可以通过添加或减去(*pointer)来更改字符。例如,您已将pointer初始化为&given[3](与given + 3相同),因此它指向字母T。因此(*pointer) + 1U(*pointer) - 2R。如果要保存新角色,可以编写

*pointer = (*pointer) - 2;

或只是

(*pointer) -= 2;

你还需要担心字母表中的“掉线”。例如,(*pointer) + 7将是Z之后的字符,但您可能希望它“回绕”回A。最简单的方法是,如果*pointer > 'Z'减去26(因为字母表中有26个字母),或者如果*pointer < 'A'则减去26。您也可以使用模数运算符(%),但这更复杂。


把所有这些放在一起:

  • 我们知道我们总是会在-5到5之间添加一个恒定值。
  • 我们将通过将每个值添加到字符串中的每个字符并打印结果来测试每个值。

这是一个可以做到这一点的算法:

  1. 创建一个包含变量的循环,比如说key,从-5到5。
  2. 在循环内部,将given重置为其初始字符串。
  3. 同样在循环内部,创建一个第二个循环
    1. pointer初始化为given + 3
    2. key的值添加到*pointer
    3. 处的字符处
    4. 在每次迭代期间递增pointer
    5. pointer命中空字符时,
    6. 回绕到字符串的开头
    7. pointer再次返回given + 3时停止。
  4. 我会留给你写代码。如果您遇到问题,请随时更新您的问题,并记住添加您编写的代码!

    祝你好运!

答案 3 :(得分:0)

你基本上是在寻找一种模式:

-5 BFLO CDI
-4 CGMPADEJ
-3 DHNQBEFK
-2 EIORCFGL
-1 FJPSDGHM
+0 GKQTEHIN
+1 HLRUFIJO
+2 IMSVGJKP
+3 JNTWHKLQ
+4 KOUXILMR
+5 LPVYJMNS

但遍历和密钥添加的说明很清楚,因此你需要尝试各种方式(基本上就像搜索一个跨越拼图的未知单词的单词)。

前进和后退可能意味着前进,然后一直向后或向前和向后同时进行。

添加一个常量键(2,3或4)会给你一行,但是从一行中的任何一点向前和向后遍历行似乎都会产生垃圾,因此将索引(可能带有一个常量)作为关键变量,所以你需要查看'//','\','/ \','/'前后以及从中到端和从中到中的模式,其中对角线表示方向。