在CS50的第2周的替换问题中,为什么我们要在这个代码的密文数组中存储“/0”?

xmjla07d  于 2023-08-03  发布在  其他
关注(0)|答案(1)|浏览(85)
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

bool check_char(string key);
void cipher_function(string plaintext, string argv);

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }
    if (!check_char(argv[1]))
    {
        printf("Key must contain 26 unique characters.\n");
        return 1;
    }

    // Get plaintext from user
    string plaintext = get_string("plaintext: ");

    // Function to generate and print ciphertext based on plaintext and key
    cipher_function(plaintext, argv[1]);

}

bool check_char(string key)
{
    int length;
    length = strlen(key);

    if (length != 26)
    {
        return false;
    }
    for (int i = 0; i < length; i++)
    {
        key[i] = toupper(key[i]);
    }
    for (int i = 0; i < length; i++)
    {
        if (!isalpha(key[i]))
        {
            return false;
        }
        for (int j = i + 1; j < length; j++)
        {
            if (key[i] == key[j])
            {
                return false;
            }
        }
    }
    return true;
}

void cipher_function(string plaintext, string argv)
{
    int length = strlen(plaintext);
    int index;
    char ciphertext[length + 1];

    for (int i = 0; i < length; i++)
    {
        if (islower(plaintext[i])) // If plaintext character is lowercase
        {
            index = plaintext[i] - 97;
            ciphertext[i] = argv[index];
            if (isupper(ciphertext[i])) // If the ciphertext char for corresponding plaintext is upper, then convert to lower
            {
                ciphertext[i] += 32;
            }
        }
        else if (isupper(plaintext[i])) // If plaintext character is uppercase
        {
            index = plaintext[i] - 65;
            ciphertext[i] = argv[index];
            if (islower(ciphertext[i]))
            {
                ciphertext[i] -= 32;   // If the ciphertext char for corresponding plaintext is lower, then convert to upper
            }
        }
        else
        {
            ciphertext[i] = plaintext[i]; // To print out non-alpha characters in the plaintext like spaces, numbers etc.
        }
    }
    ciphertext[length] = '\0';
    printf("ciphertext: %s\n", ciphertext);
}

字符串
因此,我尝试不存储/0(第92行),只将密文数组的长度设置为等于明文数组(第65行)。这导致一些输入在输出的末尾显示一个带有问号的奇怪符号。
我在某个地方读到,我们需要存储/0来向编译器显示字符串的结束位置。我知道这适用于字符串,但它究竟如何适用于数组?

fdbelqdn

fdbelqdn1#

这并不适用于数组,只适用于您希望使用字符串操作函数处理的字符数组。它只是一个约定,一个被大多数标准库所遵循的强大约定。但是你可以让字符串以不同的方式工作,重新实现所有的字符串操作函数。
在C中,字符串(可变长度字符串)是通过使用固定长度数组(数组大小必须在编译时静态定义,因此通常您会指定最大长度存储,并使用某些约定结束字符串)来存储它的字符。因此,我们需要有某种方法来指示打印和字符串操作函数字符串结束的位置,这样就不会再进行处理了。有不同的方法可以做到这一点,但C设计师选择的是在字符串的最后一个有效字符之后放置一个特殊字符\0(不是/0,它不是一个字符,而是两个字符),这就是为什么要在数组中分配多一个字符单元格来容纳最后一个\0字符。

相关问题