我需要编写一个获取字符串和数字N
的函数,该函数将在加密字符串的同一指针中返回。该函数将按以下规则加密字符串:
"Amnon"
,则结果为"nonmA"
。N
的值替换,例如:如果N
= 3,那么结果将是"nonmA"
而不是"qrqpD"
我做反向部分没有问题,但我正在努力切换每个字母。这是我到目前为止编写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void StRreverse(char* mystr, int N);
void StRreverse(char* mystr, int N)
{
int c, length, n;
char *begin, *end, temp;
length = strlen(mystr);
begin = mystr;
end = mystr;
for (c = 0; c < length - 1; c++)
{
end++;
}
for (c = 0; c < length / 2; c++)
{
temp = *end;
*end = *begin;
*begin = temp;
begin++;
end--;
}
}
void main()
{
char string[100];
printf("Enter some text\n");
gets(string);
StRreverse(string);
printf("Reverse of entered string is \"%s\".\n", string);
system("pause");
}
答案 0 :(得分:1)
首先,以便携方式识别'字母':
#include <ctype.h>
然后,您可以使用isalpha(mystr[c])
来识别字母,特别是islower
和isupper
。然后,在每个字母上添加常量 modulo 26 。也就是说,如果a
变为b
,则y
变为z
,z
将再次为a
。
该操作依赖于编码,因为并非所有编码都具有连续定义的“a”到“z”和“A”到“Z”。幸运的是,你不太可能拥有这样一个系统:)(虽然这是一个有趣的练习,可以解决这个问题不成为一个问题!)。
诀窍是'环绕',偏移量为A
或a
,因此大写字母和小写字母需要单独的代码行:
if (isupper(mystr[c]))
mystr[c] = 'A' + ((mystr[c]-'A' + N + 26) % 26);
if (islower(mystr[c]))
mystr[c] = 'a' + ((mystr[c]-'a' + N + 26) % 26);
其中N
可以低至-25
,或者您想要的最高值。该下限(以及在语句中添加26
)是因为在C的某些实现中,取负数的模数也会返回负数。
要解码此文本 - 正确称为Caesar Cypher - ,您可以使用-N
应用相同的公式。
答案 1 :(得分:0)
切换的最简单方法是在该字符上添加数字。例如
`char str [n] = {'a','b','c','d'};
for(int i = 0; i小于n; i ++) str [i] = str [i] +3; //我们正在添加3来切换 `
我不记得小'a'的ascii号码。但是如果上面的代码36将使它成为'd'。希望它适用于你