使用指针加密字符串的函数

时间:2015-03-29 09:54:12

标签: c string pointers encryption

我需要编写一个获取字符串和数字N的函数,该函数将在加密字符串的同一指针中返回。该函数将按以下规则加密字符串:

  1. 反转字符串,例如:如果字符串为"Amnon",则结果为"nonmA"
  2. 反过来后,每个字母都需要被N的值替换,例如:如果N = 3,那么结果将是"nonmA"而不是"qrqpD"
  3. 我做反向部分没有问题,但我正在努力切换每个字母。这是我到目前为止编写的代码:

    #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");
    }
    

2 个答案:

答案 0 :(得分:1)

首先,以便携方式识别'字母':

#include <ctype.h>

然后,您可以使用isalpha(mystr[c])来识别字母,特别是islowerisupper。然后,在每个字母上添加常量 modulo 26 。也就是说,如果a变为b,则y变为zz将再次为a

该操作依赖于编码,因为并非所有编码都具有连续定义的“a”到“z”和“A”到“Z”。幸运的是,你不太可能拥有这样一个系统:)(虽然这是一个有趣的练习,可以解决这个问题成为一个问题!)。

诀窍是'环绕',偏移量为Aa,因此大写字母和小写字母需要单独的代码行:

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'。希望它适用于你