cs50 - pset 2 - 替换程序

cs50 - pset 2 - substitution program

我正在执行 cs50 pset 2 - 替换,我们必须使用用户在命令行中提供的密钥加密明文,但以下代码没有提示输入.我究竟做错了什么?任何帮助将不胜感激!

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

int check(int c, string key);

int main(int argc, string argv[])
{
    int checkR = check(argc, argv[1]);
    if(checkR == 1)
    {
        return 1;
    }
    else
    {
        string key = argv[1];
        string ptext = get_string("plaintext: ");
        int len = strlen(ptext);
        char ctext[len];
        for (int i = 0; i < len; i++)
        {
            if(isupper(ptext[i]))
                ctext[i] = toupper(key[(int)ptext[i] - 65]);
            else if(islower(ptext[i]))
                ctext[i] = tolower(key[(int)ptext[i] - 97]);
            else
                ctext[i] = ptext[i];
        }
        printf("ciphertext: %s\n", ctext);
        return 0;
    }
}

int check(int c, string key)
{
    int keyL = strlen(key);
    
    if(c != 2)
        return 1;
        
    else if(keyL != 26)
        return 1;
    
    for(int i = 0; i < keyL - 1; i++)
    {
        for(int j = i; j < keyL; j++)
        {
            if(key[i] == key[j])
                return 1;
        }
    }
    
    return 0;
}

问题的答案

check 函数中,您将内部循环初始化为 int j = i
因此,在第一次迭代中,key[i] == key[j] 将始终为真。
然后,1check 返回,它阻止 main 函数打印提示。
初始化应该是int j = i + 1.

其他错误

首先,在检查c之前做int keyL = strlen(key);是不好的,因为keyargv[1])当c时可能是NULL (argc) 小于 2.

其次,此代码中的printf("ciphertext: %s\n", ctext);将调用未定义的行为,因为ctext中存储的不是NUL-terminated。
char ctext[len]; 应该是 char ctext[len+1]; 并且 ctext[len]='[=29=]'; 应该在 printf("ciphertext: %s\n", ctext); 之前添加。