0

问题如下:

使用指针算术解决以下密码。给定的字符串是 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);

打印出“编译器”一词。

4

4 回答 4

0

如何“在每个字母表中添加/减去单个值……”?

计算机只能理解和处理数字,因为计算机中的一切都是数字(或可以被视为数字)。这意味着字母实际上是内部的数字。char在 C 中使用ASCII 编码,这使得每个字母对应一个数字。因此,您只需将密钥添加到表示该char. 您可以毫无问题char地用作数字。

char a = 'a';
a++;
printf("%c\n", a); // prints 'b'
于 2013-11-07T15:03:18.240 回答
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)会给你一行,但是从一行中的任何点向前和向后遍历行似乎会产生垃圾,因此将索引(可能带有常量)作为键变量,所以你需要看看像'//','\','/\','/'这样的模式向后和向前以及从中间到结束和从端到中间,其中对角线表示方向。

于 2013-11-07T21:43:38.370 回答
0

您需要在这里应用两个概念:

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

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

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

第二,*pointerpointer指向的字符。

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

*pointer = (*pointer) - 2;

要不就

(*pointer) -= 2;

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


把所有这些放在一起:

  • 我们知道我们将始终添加一个介于 -5 和 5 之间的常数值。
  • 我们将通过将每个值添加到字符串中的每个字符并打印结果来测试每个值。

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

  1. 创建一个带有变量的循环,比如说key,它从 -5 运行到 5。
  2. 在循环内部,重置given为其初始字符串。
  3. 同样在循环内,创建第二个循环
    1. 初始化pointergiven + 3,
    2. 将 的值添加key到 处的字符*pointer
    3. pointer每次迭代期间的增量
    4. pointer遇到空字符时回绕到字符串的开头,并且
    5. pointer再次返回时停止given + 3

我会留给你写代码。如果您遇到困难,请随时更新您的问题,并记得添加您编写的代码!

祝你好运!

于 2013-11-07T15:50:48.327 回答
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'
}
于 2013-11-07T15:08:11.957 回答