问题是:
使用指针算法解决以下密码。给定的字符串是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”一词。
答案 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}}再次。
其次,*pointer
是pointer
指向的字符。
您可以通过添加或减去(*pointer)
来更改字符。例如,您已将pointer
初始化为&given[3]
(与given + 3
相同),因此它指向字母T
。因此(*pointer) + 1
为U
,(*pointer) - 2
为R
。如果要保存新角色,可以编写
*pointer = (*pointer) - 2;
或只是
(*pointer) -= 2;
你还需要担心字母表中的“掉线”。例如,(*pointer) + 7
将是Z
之后的字符,但您可能希望它“回绕”回A
。最简单的方法是,如果*pointer > 'Z'
减去26(因为字母表中有26个字母),或者如果*pointer < 'A'
则减去26。您也可以使用模数运算符(%
),但这更复杂。
把所有这些放在一起:
这是一个可以做到这一点的算法:
key
,从-5到5。given
重置为其初始字符串。pointer
初始化为given + 3
,key
的值添加到*pointer
,pointer
pointer
命中空字符pointer
再次返回given + 3
时停止。我会留给你写代码。如果您遇到问题,请随时更新您的问题,并记住添加您编写的代码!
祝你好运!答案 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)会给你一行,但是从一行中的任何一点向前和向后遍历行似乎都会产生垃圾,因此将索引(可能带有一个常量)作为关键变量,所以你需要查看'//','\','/ \','/'前后以及从中到端和从中到中的模式,其中对角线表示方向。