0

我为 pset2 问题创建了一个代码,在 C 中命名为替换。

程序在命令行中获取一个字符串并将其应用于给定的文本并对其进行更改,从而打印密文。

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{

    //First part, checks KEY input

    if (argc != 2)  // checks quantity of command-line arguments
    {
        printf("Usage: ./substitution KEY\n");
        return 1;
    }
    int i = 0;
    int largo = strlen(argv[1]);

    while (i < largo) //checks if char are alphabetic
    {
        if (isalpha(argv[1][i]) == 0)
        {
            printf("Key must contain only alphabetic characters\n");
            return 1;
        }
        else //changes to uppercase
        {
            argv[1][i] = toupper(argv[1][i]);
        }
        i++;
    }

    if (i != 26)  //checks length of Key
    {
        printf("Key must be 26 characters long\n");
        return 1;
    }

    for (int j = 0; j < largo - 1; ++j) //checks repetition of characters
    {

        for (int k = j + 1; k < largo; ++k)
        {

            if (argv[1][j] == argv[1][k])
            {
                printf("Key must not have duplicated characters\n");
                return 1;
            }
        }
    }

    //second part asks for input

    //declaration of strings to get and transform

    string plaintext = get_string("plaintext:");
    string alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    string ciphertext = plaintext;

    //third part: cifrado

    for (int x = 0; x < strlen(plaintext); ++x)
    {
        if (isalpha(plaintext[x]) != 0)
        {
            int lower = 0;
            if (islower(plaintext[x]) != 0) // is lower case?
            {
                lower = 1;
                plaintext[x] = toupper(plaintext[x]);
            }

            for (int y = 0; y < strlen(alfabeto); ++y)
            {
                //printf("alfa: %c   text: %c\n", alfabeto[y], plaintext[x]);

                if (alfabeto[y] == plaintext[x])
                {
                    ciphertext[x] = argv[1][y];
                    //printf("c: %s\n", ciphertext);
                    break;
                }
            }
            if (lower == 1)
            {
                ciphertext[x] = tolower(ciphertext[x]);
            }
        }
    }
    printf("ciphertext: %s", ciphertext);
    printf("\n");
    return 0;
}

问题是最后一个 if 语句将“密文”中的字符分配给“明文”变量,所以我不得不在其中添加一个 break 语句来阻止它。

任何猜测为什么当没有“break”语句时这个程序不能按预期工作?

                if (alfabeto[y] == plaintext[x])
                {
                    ciphertext[x] = argv[1][y];
                    //printf("c: %s\n", ciphertext);
                    break;
                }
4

0 回答 0