【问题标题】:Caesar Cipher Code Flaw凯撒密码缺陷
【发布时间】:2017-01-30 11:42:47
【问题描述】:

我编写了一个似乎在大多数测试中都有效但在少数情况下失败的凯撒密码。更多测试详情https://www.hackerrank.com/challenges/caesar-cipher-1

基本信息:密码只加密字母,符号等保持未加密状态。

在这种情况下失败:

90
!m-rB`-oN!.W`cLAcVbN/CqSoolII!SImji.!w/`Xu`uZa1TWPRq`uRBtok`xPT`lL-zPTc.BSRIhu..-!.!tcl!-U
62

其中 90 是 n(字符串中的字符),第二行是数组 s 中的字符串,62 是 k(字母旋转的数量)

对我的代码缺陷的任何洞察都将受到高度赞赏

代码:

int main(){
int n;
scanf("%d",&n);
char* s = (char *)malloc(10240 * sizeof(char));
scanf("%s",s);
int k;
scanf("%d",&k);

if (k>26) {
    k%=26;
}

int rotation;
for(int i = 0; i<n; i++) {
    if (s[i] >= 'a' && s[i] <= 'z') {
        if((s[i] + k) > 'z' ) {
            rotation = (s[i] - 26) + k;
            s[i] = rotation;
        } else {
            s[i] = s[i]+k;
        }

    } else if (s[i] >= 'A' && s[i] <= 'Z') {
        if((s[i] + k) >= 'Z' ) {
            rotation = (s[i] - 26) + k;
            s[i] = rotation;
        } else {
            s[i] = s[i]+k;
        }
    } 

}

for(int i=0; i<n; i++) {
    printf("%c", s[i]);
}

return 0;
}

【问题讨论】:

  • 如何在这种情况下失败了?请更具体。
  • 另外,你调试了吗?这几乎肯定只是一个“一次性”的索引错误。
  • 这不是问题,但scanf("%s",s); 容易受到缓冲区溢出的影响。确保您永远不会在生产代码中执行此类操作的最佳方法是养成从不执行此类操作的习惯,即使是在玩具问题中也是如此。
  • 为什么是malloc(10240 * sizeof(char)); 而不是malloc(n+1);?在任何情况下使用getchar() 可能会更好; scanf("%s") 将在第一个空格字符处停止并导致 scanf("%d",&amp;k); 失败。另外,if (k&gt;26) { k%=26; } 是错误的,应该是 if (k&gt;25) { k%=26; } 或只是 k%=26;。代替for(int i=0; i&lt;n; i++) { printf("%c", s[i]); }puts(s); 怎么样?
  • 嗨@JohnColeman我不太确定为什么它在这种情况下特别失败,我无法真正调试它,因为我正在通过网站进行调试,它不会显示任何其他结果而不是通过或失败。我将不得不等到我回家建造,看看我得到了什么错误

标签: c string algorithm encryption caesar-cipher


【解决方案1】:

好的,伙计们,所以我想通了。

Old Code:
 if((s[i] + k) >= 'Z' )
New Code:
 if((s[i] + k) > 'Z' )

当给定一个 P(ascii 80) 时它搞砸了,它应该在 Z(ascii 90) 处停止,而是做了这个计算:

s[i] - 26 + k  = 64
  80 - 26 + 10 = 64 (ascii for @) and thus '@' was returned instead of Z

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 2020-05-31
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-26
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多