对于 CS50 替换问题,比较 C 中字符串内的字符值的问题

Issue with comparing character values inside of a string in C for CS50 subsitution problem

节目规格为

设计并实现一个替代程序,使用替代密码对消息进行加密。

在名为 substitution 的目录中名为 substitution.c 的文件中实现您的程序。

您的程序必须接受单个命令行参数,即用于替换的键。键本身应该不区分大小写,因此键中的任何字符是大写还是小写都不会影响程序的行为。

如果您的程序在没有任何命令行参数或有多个命令行参数的情况下执行,您的程序应该打印一条您选择的错误消息(使用 printf)和 return from main a value立即为 1(这往往表示错误)。

如果密钥无效(如不包含 26 个字符、包含任何非字母字符或每个字母不恰好包含一次),您的程序应该打印一条您选择的错误消息(使用 printf ) 和 return 来自 main 的值立即为 1。

您的程序必须输出明文:(没有换行符)然后提示用户输入一串明文(使用 get_string)。

你的程序必须输出密文:(没有换行符)后跟明文对应的密文,明文中的每个字母字符替换密文中的相应字符;非字母字符应原样输出。

您的程序必须保留大小写:大写字母必须保持大写;小写字母必须保持小写字母。

输出密文后,应该打印一个换行符。然后你的程序应该通过 returning 0 from main.

退出

我能够完成所有这些,除了进行重复输入

我想这部分代码有问题,但我不明白为什么。

当我输入终端时,我不断得到一个重复的值,即 != ./替换 YTNSHKVEFXRBAUQZCLWDMIPGJO

我不明白为什么,因为代码本身似乎没问题。它在数组内部检查值是否重复,然后增加值计数器,但它不起作用。

当我在 vscode 调试中进行测试 运行 时,我得到的 duplicate for this 的最终值等于 25,这超出了我的理解范围。 enter image description here

我下面的代码是

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

int main(int argc, string argv[])
{
    //Check is to keep track if it fulfills all requirements
    int check = 0;

    // Check if the agrc values are equal to 2 or not, if not have to ask for it again
    if (argc != 2)
    {
        printf("./substitution key\n");
        return 1;
    }
    else
    {
        check++;
    }

    // Get the length of the string
    int n = strlen(argv[1]);
    // Check if the length of inputted characters is 26 or not
    if (n != 26)
    {
        printf("Key must contain 26 characters\n");
        return 1;
    }
    else
    {
        check++;
    }

    // Check if there are 26 letters
    int letterCheck = 0;
    // To get number of digits
    // Loop through out the second input through terminal to see if the values are correct
    for (int i = 0; i < n; i++)
    {
        if (isalpha(argv[1][i]))
        {
            letterCheck++;
        }
    }
    if (letterCheck != 26)
    {
        printf("Key must contain 26 letters\n");
        return 1;
    }
    else
    {
        check++;
    }

    // Check for duplicates
    int duplicate = 0;
    for (int a = 0; a < n; a++)
    {
        for (int b = 1; b < n; b++)
        {
            if (toupper(argv[1][a]) == toupper(argv[1][b]))
            {
                duplicate++;
            }
        }
    }
    if (duplicate != 0)
    {
        printf("Key must not contain repeated characters\n");
        return 1;
    }
    else
    {
        check++;
    }
    if (check == 4)
    {
        string plaintext = get_string("plaintext: ");
        // Get the length of the string
        int length = strlen(plaintext);

        for (int i = 0; i < length; i++)
        {
            if (isupper(plaintext[i]))
            {
                plaintext[i] = plaintext[i] - 65;
                plaintext[i] = argv[1][(int)plaintext[i]];
                plaintext[i] = toupper(plaintext[i]);
            }
            else
            {
                plaintext[i] = plaintext[i] - 97;
                plaintext[i] = argv[1][(int)plaintext[i]];
                plaintext[i] = tolower(plaintext[i]);
            }
        }
        printf("ciphdertext: %s\n", plaintext);
        return 0;
    }
}```

'''
    int duplicate = 0;
    for (int a = 0; a < n; a++)
    {
        for (int b = 1; b < n; b++)
        {
            if (toupper(argv[1][a]) == toupper(argv[1][b]))
            {
                duplicate++;
            }
        }
    }
    if (duplicate != 0)
    {
        printf("Key must not contain repeated characters\n");
        return 1;
    }
    else
    {
        check++;
    }
'''



您已将 'b' 值设置为“1”,因此每次循环都从 1 开始。因此,当您的外循环为 1 时,您的内循环也将从 1 开始,并且您的重复标志将递增。您的循环应该如下所示

 for (int a = 0; a < n; a++)
    {
        for (int b = a + 1; b < n; b++)
        {
            if (toupper(argv[1][a]) == toupper(argv[1][b]))
            {
                duplicate++;
            }
        }
    }