C中的左旋和右旋

时间:2012-03-31 20:12:47

标签: c

  

可能重复:
  how to rotate the given string to left or right in C?

所以我写了加密字符串的代码。被称为Ceasar密码。

但不是经常做正确的轮换。 对于Shift = 1,A = 65,所以我做65 + shift = 66,这是B. ... C => D.D => E .... 如果我想做左旋转怎么办?

现在,A(65)=> Z(90),B(66)=> A(65),C(67)=> B(65)... Y(89)=> X(88)

众所周知,除了A(65)之外,我们可以像原来一样做。

所以不要创建if(notA)... else(句柄A)。

有没有优雅的方法呢?此外,如果班次是其他数字,还有更多案例需要考虑...... 有没有其他方法可以这样做?喜欢使用mod还是什么?

2 个答案:

答案 0 :(得分:0)

有一张查询表。

    int shift;
    char inputstr[100]; //Dynamically allocate inputstr if needed.

   //Get values for 'shift' and 'inputstr'

    char encrypt[100]; //Resulting encrypted array
    char *alpha = "AB.....Z";

   // 
    for(i=0;i<strlen(inputStr);i++)
    encrypt[i] = alpha[(inputStr[i] - alpha[0]+shift)%26];

同样,如果你想混合使用小写字母,数字等,你可以有其他查找表,并相应地改变逻辑。

答案 1 :(得分:0)

将班次设置为始终正确并接受负值以处理左班次

所以

char shift(int amount, char c) {
    return ((((c - 'A') + amount) + 26) % 26) + 'A';
} 

如果用-3调用它,它将向左移动

请注意,这只适用于大写字母,您可以使它适用于小写字母只能将“A”更改为“a”,但在写入的同时它不适用于大写和小写。

编辑我将其更改为一行

这是输出

c = shift(-3, 'B'); = Y
c = shift(-3, 'F'); = C
c = shift(3, 'G'); = J
c = shift(3, 'Y'); = B