我的“Vigenere CS 50”项目运行不佳

Posted

技术标签:

【中文标题】我的“Vigenere CS 50”项目运行不佳【英文标题】:My "Vigenere CS 50" project doesn't work well 【发布时间】:2017-03-22 11:00:02 【问题描述】:

我目前正在研究 Vigenere CS 50 问题。代码看起来运行良好,但有时输出会被刚刚添加到输出字符串末尾的更多符号混淆。例如,当我用“a”的密钥加密“a”时,输出有时会像“a”一样好,有时看起来像“a

同时,代码可以在更长的键和更复杂的纯文本中正常工作,所以我现在真的很困惑,不知道从什么开始。

你能看一下代码吗?

提前致谢, 弗拉基米尔

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int main(int argc, string argv[])

    if (argc != 2)
    
    printf("Usage: ./vigenere k\n");
    return 1;
     

    string k = (argv[1]);

    int key[strlen(k)];

    int n = strlen(k);

    for (int i = 0; i < n; i++)
    
        if (isalpha(k[i]))
        
            if (isupper(k[i]))
            
                key[i] = (int)k[i] - 65;
            
            else
            
                key[i] = (int)k[i] - 97;
            
        
        else 
        
            printf("Key must be alphabetical\n");
            return 1;
        
    

    string p;

    do 
    
        printf("plaintext: ");
        p = get_string();
     while (p == NULL); 

    char c[strlen(p)];

    int cn = 0;

    for (int j = 0, m = strlen(p); j < m; j++)
    
        if (isalpha(p[j]))
        
            if (isupper(p[j])) 
            
                c[j] = (((int)p[j] + key[cn] - 65) % 26 + 65);
            
            else
            
                c[j] = (((int)p[j] + key[cn] - 97) % 26 + 97);
            

            cn++;
            cn = cn % n;
        
        else 
        
            c[j] = p[j];
        
    

    printf("ciphertext: %s", c);
    printf("\n");

    return 0;


【问题讨论】:

为什么要使用C#C++ 标签? 使用key[i] = (int)k[i] - 'A';key[i] = (int)k[i] - 'a'; 更清晰 顺便说一句,你的问题是你不是空终止你的字符串 @LPs 在字符串中也没有空间以空终止它 为了将来参考,请尽量使您的问题的标题描述您的问题。像“输出字符串末尾有随机字符”这样的东西会更好。这是一个 Vigenere 密码程序这一事实是无关紧要的,我们已经知道它不能很好地工作,否则你就不会问这个问题。 【参考方案1】:

这是一个很好的老式“非空终止”字符串。 C 风格的字符串(这是您使用char c[strlen(p)]; 创建的)没有与之关联的长度。为了计算它们的长度,标准库假定它们将以\0(一个空字节)终止。你没有这样做,所以当你 printf 时,它会继续打印,直到找到一个。

你需要:

    为空字节分配足够的空间:char c[strlen(p) + 1]; 放在最后:c[strlen(p)] = 0;

【讨论】:

以上是关于我的“Vigenere CS 50”项目运行不佳的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere cs50 在缺少第二个参数时不会抱怨

Vigenere CS50 - 需要帮助循环字母

Vigenere cs50 Pset2 末尾的额外字符

在线时音频播放不佳

将硬浮动链接到 softfp 性能不佳

运行颤振升级后iOS模拟器性能不佳